Ответ на сообщение в Nest
Запрос уходит по TCP, но страница не получает сохранённую строку: обработчик только меняет массив и ничего не отдаёт назад. Клиент ждёт поток, а завершения с данными не происходит.
Если метод на стороне слушателя
возвращает объект или массив,
Nest упаковывает значение в ответ
на запрос. В веб процессе сервис
преобразует поток клиента
в обычное значение через
firstValueFrom из RxJS
и передаёт его контроллеру страницы.
Так HTTP клиент видит тот же
результат, что лежит в памяти
удалённого класса.
Покажем на примере постов:
import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
@Controller()
export class PostMicroserviceController {
posts: { title: string }[] = [];
@MessagePattern({ cmd: 'add_post' })
addPost(@Payload() data: { title: string }) {
const post = { title: data.title };
this.posts.push(post);
return post;
}
}
Клиентский сервис дождётся объекта из удалённого класса:
import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class PostClientService {
client: ClientProxy;
constructor(@Inject('POST_SERVICE') client: ClientProxy) {
this.client = client;
}
async addPost(title: string) {
return firstValueFrom(
this.client.send({ cmd: 'add_post' }, { title }),
);
}
}
Страница примет заголовок и вернёт ответ канала:
import { Body, Controller, Post } from '@nestjs/common';
import { PostClientService } from './post.client.service.js';
@Controller('posts')
export class PostController {
postClientService: PostClientService;
constructor(postClientService: PostClientService) {
this.postClientService = postClientService;
}
@Post()
async create(@Body('title') title: string) {
return this.postClientService.addPost(title);
}
}
Измените WorkerMicroserviceController
так, чтобы после сохранения данных
работника возвращалась та же строка,
а WorkerClientService
и WorkerController
отдавали её HTTP клиенту.