Я пытаюсь использовать NestJS и микросервис NATS. Есть хорошая документация для настройки базового запроса-ответа.
Я сделал следующее:
Запустил локальный сервер NATS.
Настройте мой main.ts
для подключения к серверу:
async function bootstrap() {
const app = await NestFactory.createMicroservice(AppModule, {
options: {
url: "nats://localhost:4222",
},
transport: Transport.NATS,
});
app.listen(() => console.log("Microservice is listening"));
}
bootstrap();
Создан ClientProxyFactory для отправки обратно сообщений:
export const NatsClientProvider: Provider = {
inject: [ConfigService],
provide: NatsClientProviderId,
useFactory: async (config: ConfigService) =>
ClientProxyFactory.create({
options: {
servers: config.getNatsConfig().servers,
},
transport: Transport.NATS,
}),
};
Настройка контроллера app.controller.ts
для ответа на определенный шаблон:
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
@Inject(NatsClientProviderId) private readonly natsClient: ClientProxy,
) {}
@MessagePattern("hello")
async getHello(data: string) {
console.log("data: ", data);
console.log("getHello!!");
await this.natsClient.send("hello", this.appService.getHello());
return this.appService.getHello();
}
async onModuleInit() {
await this.natsClient.connect();
console.log("Nats connected!");
}
Настройте тестовый файл, чтобы попытаться отправить сообщение запрос-ответ:
import { connect } from "ts-nats";
async function start() {
const nc = await connect({
servers: ["nats://localhost:4222"],
});
const msg = await nc.request("hello", 5000, "me");
console.log("msg: ", msg);
}
start();
Когда я запускаю свое приложение Nest, я вижу подпись, созданную правильно в журналах сервера NATS.
Когда я запускаю файл test.ts
, он истекает с NatsError: Request timed out.
. Тем не менее, я вижу свои журналы консоли (хотя данные undefined
, хотя я указываю их в опубликованном сообщении.
Ни методы return
, ни client.send
не работают для получения сообщений из приложения.
Любая помощь приветствуется!
EDIT:
Все еще изучаю и застреваю в этом вопросе. В разделе «Отправка сообщений» Microservice docs говорится: «Шаблон должен быть равен тому, который определен в декораторе @MessagePattern (), в то время как полезная нагрузка - это сообщение, которое мы хотим передать другому microservice. ". Если я это сделаю, приложение Nest обнаружит сообщение, которое оно отправляет, и застрянет в бесконечном цикле отправки сообщения и получения одного и того же сообщения взад и вперед к себе навсегда.