node.js - NestJS MQTT 微服务的有效@MessagePattern 是什么?

标签 node.js typescript microservices mqtt nestjs

我正在尝试根据 the docs 使用 NestJS 设置 MQTT 微服务.

我已经使用 Docker 启动了一个可用的 Mosquitto Broker,并使用各种 MQTT 客户端验证了它的可操作性。现在,当我启动 NestJS 服务时,它似乎连接正确(mqqt.fx 显示新客户端),但我无法在我的 Controller 中接收任何消息。 这是我的引导,就像在文档中一样:

ma​​in.ts

async function bootstrap() {
    const app = await NestFactory.createMicroservice(AppModule, {
        transport: Transport.MQTT,
        options: {
            host: 'localhost',
            port: 1883,
            protocol: 'tcp'
        }
    });
    app.listen(() => console.log('Microservice is listening'));
}
bootstrap();

app.controller.ts

@Controller()
export class AppController {

    @MessagePattern('mytopic') // tried {cmd:'mytopic'} or {topic:'mytopic'}
    root(msg: Buffer) {
        console.log('received: ', msg)
    }
}

我是不是错误地使用了消息模式装饰器,或者我对 NestJS MQTT 微服务应该做什么的概念是错误的?我认为它可能会订阅我传递给装饰器的主题。我唯一的其他信息来源是相应的 unit tests

最佳答案

nest.js 模式处理程序

在 nest.js 端,我们有以下模式处理程序:

@MessagePattern('sum')
sum(data: number[]): number {
  return data.reduce((a, b) => a + b, 0);
}

作为@Alexandre解释一下,这实际上会监听 sum_ack


非 nest.js 客户端

非 nest.js 客户端可能如下所示(只需另存为 client.js,运行 npm install mqtt 并使用 node client.js 运行程序) :

var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://localhost:1883')

client.on('connect', function () {
  client.subscribe('sum_res', function (err) {
    if (!err) {
      client.publish('sum_ack', '{"data": [2, 3]}');
    }
  })
})

client.on('message', function (topic, message) {
  console.log(message.toString())
  client.end()
})

它在主题sum_ack 上发送消息,并在sum_res 上收听消息。当它在 sum_res 上收到消息时,它会记录消息并结束程序。 nest.js 期望消息格式为 {data: myData} 然后调用参数处理程序 sum(myData)

// Log:
{"err":null,"response":5} // This is the response from sum()
{"isDisposed":true} // Internal "complete event" (according to unit test)

当然,这样不是很方便……


nest.js 客户端

那是因为这意味着要与另一个 nest.js 客户端一起使用,而不是与普通的 mqtt 客户端一起使用。 nest.js 客户端抽象出所有的内部逻辑。参见 this answer ,它描述了redis的客户端(mqtt只需要改两行)。

async onModuleInit() {
  await this.client.connect();
  // no 'sum_ack' or {data: [0, 2, 3]} needed
  this.client.send('sum', [0, 2, 3]).toPromise();
}

关于node.js - NestJS MQTT 微服务的有效@MessagePattern 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964076/

相关文章:

javascript - 如何防止 Javascript 改变 Selenium 中的页面?如何下载原始页面源代码?

typescript - 在 TypeScript 2.4 中使用 Partial 类型进行覆盖

typescript - 是否可以让函数接受类实例,但不接受普通对象?

typescript - 在等待来自服务的异步/REST 数据时防止错误呈现到 View - RxJS/Angular2

c# - 从一个位置调用多个 ASP.Net Core 微服务

spring - 使用reactor等待多个http响应

ios - 如何读取Azure应用服务中的请求正文?

javascript - 让 promise 在返回前等待几秒钟

c# - 如何在 ASP.NET 中处理微前端?

node.js - 使用sequelize-cli后如何从sequelize.model获取模型