首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestJS NATS请求-响应

NestJS NATS请求-响应
EN

Stack Overflow用户
提问于 2019-06-12 02:24:30
回答 2查看 4.4K关注 0票数 5

我正在尝试使用NestJS和NATS微服务。有很好的documentation来设置基本的请求-响应。

我所做的如下所示:

已运行本地NATS服务器。

设置我的main.ts以连接到服务器:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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以响应特定模式:

代码语言:javascript
复制
@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!");
  }

设置测试文件以尝试发送请求-响应消息:

代码语言:javascript
复制
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的,尽管我在发布的消息中指定了它。

returnclient.send方法都无法从应用程序接收返回的消息。

如有任何帮助,我们不胜感激!

编辑:仍在研究并坚持这个问题。在Microservice docs的“发送消息”部分,它说“模式必须等于@MessagePattern()装饰器中定义的模式,而有效负载是我们想要传输给另一个微服务的消息”。如果我这样做了,Nest应用程序会检测到它发送的消息,并陷入一个无限循环,即永远发送消息和接收相同的消息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-14 21:17:25

要避免在控制器中出现无限循环,请删除natsClient.send语句。MessagePattern将自动发送一个回复,其中包含您从函数返回的数据,在本例中为this.appService.getHello()

代码语言:javascript
复制
@MessagePattern("hello")
async getHello(data: string) {
  console.log("data: ", data);
  return "Hello World!";
}

Nest要求您发送一个很长的id属性(任何字符串都可以),以便它能够回复消息。只需将其包含在数据json中:

代码语言:javascript
复制
// Nest expects the data to have the following structure
const reply = await nc.request("hello", 500, JSON.stringify({ data: "Hello", id: "myid" }));
console.log({ reply });

在嵌套日志中,您将看到以下日志条目:

代码语言:javascript
复制
data: Hello

在您的测试脚本中,您将看到:

代码语言:javascript
复制
{ reply:
   { subject: '_INBOX.GJGL6RJFYXKMCF8CWXO0HB.GJGL6RJFYXKMCF8CWXO0B5',
     sid: 1,
     reply: undefined,
     size: 50,
     data: '{"err":null,"response":"Hello World!","id":"myid"}' 
} }
票数 4
EN

Stack Overflow用户

发布于 2019-06-14 02:32:31

使用ClientProxy时,sendemit返回可观察对象。你需要“激活”它们才能做任何事情。因此,您可以对它们执行subscribe操作,也可以将其更改为Promise。

由于您使用的是await,因此您可能希望这样做

代码语言:javascript
复制
await this.natsClient.send("hello", this.appService.getHello()).toPromise();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56549704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档