РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpMcSm 161 of 201 menu
◀ ▶

Отправка сообщения в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить