我正在尝试使用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
方法都无法接收来自应用程序的消息。非常感谢您提供帮助!
编辑: 仍在研究和困扰这个问题。在 Microservice docs 的“发送消息”部分中,它说:“模式必须等于 @MessagePattern() 装饰器中定义的模式,而有效载荷是我们想要传输到另一个微服务的消息。”如果我这样做,Nest 应用程序会检测到它发送的消息,并陷入一个无限循环,不断地将消息发送和接收回自己,直到永远。
id
字段。 - Kim Kernuser.get.>
,以便我可以接收到发送到user.get.MY_USER_ID
的消息,并能够看到MY_USER_ID
是主题中的内容。 - rhlsthrm@MessagePattern('hello.>')
和请求主题hello.world
)。现在,如果我能够打印出主题,那就没问题了。 - rhlsthrm