Как опубликовать mqtt на NestJS?

#mqtt #nestjs

#mqtt #nestjs

Вопрос:

Я создаю клиент mqtt с использованием NestJS

Я использовал @MessagePattern для подтверждения подписки. (@Ctx, @Payload информация также проверяется нормально.)

Кстати, информация о клиенте mqtt создается в app.module Я попытался использовать MqttClient с помощью @Inject в контроллере, в client.push возникает следующая ошибка.

Помогите мне (client.publish контроллера не работает.)

[main.ts]

 async function bootstrap() {
  /*const app = await NestFactory.create(AppModule);
  await app.listen(3000);*/

  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
      AppModule,{
        transport:Transport.MQTT,
        options:{
          url : 'serverIp',
          username : 'name',
          password : 'pwd',
          port : 1883,
          protocol : 'mqtt'
        }
      },
  );

  app.listen(() =>{
    console.log('[Agent Server is Listening...]');
  })

}
bootstrap();
  

[app.module.ts]

 @Module({
  imports: [      
    ClientsModule.register([
      {
        name: 'MQ_CLIENT',
        transport: Transport.MQTT,
        options: {
          host:'serverIp',
          port:1883,
          //protocol:'mqtt',
          username:'name',
          password:'pwd'
        }
      },
    ]),
    ConfigModule
  ],
  controllers: [AppController, VcController],
  providers: [AppService, VcService],
})
export class AppModule {}
  

[Контроллер]

 @Controller('vc')
export class VcController {

    constructor(
        @Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly logger : LoggerService,
        @Inject('MQ_CLIENT') private client : MqttClient
    ) {}

    @MessagePattern('SomeTopic)
    private tempFunction(@Ctx() context: MqttContext, @Payload() data){
      
        this.client.publish('Publish TopicId', 'tttaaaaaa'); //The problem arises here
    }
}
  

[Сообщение об ошибке]

 TypeError: callback is not a function
    at ClientMqtt.publish (C:Wrok_GitDemo20201013_nestjsMqttmqtt-agent-02node_modules@nestjsmicroservicesclientclient-mqtt.js:104:13)
    at VcController.vcTest (C:Wrok_GitDemo20201013_nestjsMqttmqtt-agent-02distcontrollervcvc.controller.js:40:21)
    at C:Wrok_GitDemo20201013_nestjsMqttmqtt-agent-02node_modules@nestjsmicroservicescontextrpc-context-creator.js:44:33
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async C:Wrok_GitDemo20201013_nestjsMqttmqtt-agent-02node_modules@nestjsmicroservicescontextrpc-proxy.js:11:32
    at async ServerMqtt.handleEvent (C:Wrok_GitDemo20201013_nestjsMqttmqtt-agent-02node_modules@nestjsmicroservicesserverserver.js:61:32)
  

Комментарии:

1. Он жалуется, что ваша this.client.publish() функция должна иметь функцию обратного вызова (). Теперь, почему он ищет это, я не знаю ….. Я не вижу этого в коде.

2. this.client.publish(‘SmartHome/02VC01/12345678’, ‘tttaaaaaa’, function(){ console.log(«это обратный вызов»); }) Я протестировал его в форме, подобной этой, но произошла та же ошибка..

Ответ №1:

Я немного покопался и пришел к следующему:

https://github.com/nestjs/nest/issues/6403

Суть в том, что вам нужно предварительно вызвать mqttClient.connect() , но вы не найдете эту функцию в интерфейсе для нее.

Ответ №2:

Это работает для меня —

 constructor(@Inject('MQ_CLIENT') private client: ClientProxy) {
    client.connect();
}

@MessagePattern('SomeTopic')
private tempFunction(@Ctx() context: MqttContext, @Payload() data) {
    this.client.emit('help', 'data');
}
  

Ответ №3:

С кодом вопроса все в порядке. Замените строку только this.client.publish('Publish TopicId', 'tttaaaaaa'); на this.client.emit('Publish TopicId', 'tttaaaaaa')

Комментарии:

1. Вам нужно будет включить гораздо больше контекста, чтобы это был правильный ответ.

2. @hardillb Я не понимаю, когда я отмечаю подобные сообщения как «не ответ», он отклоняется. Согласно стандартам SO, это неверный ответ, не так ли? Существует просто неформатированный фрагмент кода без каких-либо объяснений.