Отправка сообщения в Nest
HTTP приложение должно спросить данные у соседнего процесса, но в модуле страницы нет связи с TCP каналом. Без клиента и без обработчика на другой стороне запрос зависнет или вернёт пустоту.
Корневой модуль веб процесса
импортирует ClientsModule.register
с именем клиента, транспортом TCP
и тем же адресом, что у слушателя.
Сервис получает прокси клиента
через конструктор по этому имени
и отправляет запрос с шаблоном
на латинице. Параллельно в процессе
слушателя должен жить класс
с тем же шаблоном, иначе ответ
не сформируется.
Покажем на примере постов:
import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
@Controller()
export class PostMicroserviceController {
posts: { title: string }[] = [];
@MessagePattern({ cmd: 'list_posts' })
listPosts() {
return this.posts;
}
@MessagePattern({ cmd: 'add_post' })
addPost(@Payload() data: { title: string }) {
const post = { title: data.title };
this.posts.push(post);
return post;
}
}
В HTTP приложении зарегистрируем клиент и сервис, который шлёт запрос и ждёт результат:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { PostController } from './post.controller.js';
import { PostClientService } from './post.client.service.js';
@Module({
imports: [
ClientsModule.register([
{
name: 'POST_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3001,
},
},
]),
],
controllers: [PostController],
providers: [PostClientService],
})
export class AppModule {}
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 listPosts() {
return firstValueFrom(
this.client.send({ cmd: 'list_posts' }, {}),
);
}
}
Страница отдаёт то, что вернул удалённый класс:
import { Controller, Get } from '@nestjs/common';
import { PostClientService } from './post.client.service.js';
@Controller('posts')
export class PostController {
postClientService: PostClientService;
constructor(postClientService: PostClientService) {
this.postClientService = postClientService;
}
@Get()
async list() {
return this.postClientService.listPosts();
}
}
Зарегистрируйте TCP клиент
в корневом модуле HTTP приложения
работников, опишите
WorkerClientService
с ожиданием списка из удалённого
WorkerMicroserviceController
и отдайте результат на странице
WorkerController.