#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, это неверный ответ, не так ли? Существует просто неформатированный фрагмент кода без каких-либо объяснений.