MQTT + NestJS TypeError当直接运行NodeJS时

55ooxyrt  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(187)

尝试使用PM2/NodeJS托管时出现NestJs + MQTT错误

我尝试在NestJs中使用带有MessagePatterns的Controller来处理一些MQTT主题上的消息。我也在使用NX Monorepo。我跑步的时候一切都很好:

yarn nx serve api

我正在制定部署策略,当我使用以下命令编译项目时:

yarn nx run-many --t=build --configuration=production

一切都很好。
当我尝试使用

node ./dist/apps/api/main.js

这将导致以下错误消息

/home/user/Desktop/project/node_modules/mqtt/lib/client.js:701
  const resubscribe = obj.resubscribe
                          ^

TypeError: Cannot read properties of undefined (reading 'resubscribe')
    at MqttClient.subscribe (/home/user/Desktop/project/node_modules/mqtt/lib/client.js:701:27)
    at /home/user/Desktop/project/node_modules/@nestjs/microservices/server/server-mqtt.js:40:24
    at Array.forEach (<anonymous>)
    at ServerMqtt.bindEvents (/home/user/Desktop/project/node_modules/@nestjs/microservices/server/server-mqtt.js:38:28)
    at ServerMqtt.start (/home/user/Desktop/project/node_modules/@nestjs/microservices/server/server-mqtt.js:32:14)
    at ServerMqtt.listen (/home/user/Desktop/project/node_modules/@nestjs/microservices/server/server-mqtt.js:24:18)
    at /home/user/Desktop/project/node_modules/@nestjs/microservices/nest-microservice.js:107:25
    at new Promise (<anonymous>)
    at NestMicroservice.listen (/home/user/Desktop/project/node_modules/@nestjs/microservices/nest-microservice.js:106:16)

我尝试了以下操作(未成功)

  • 不同的NodeJS版本(目前在v18.16.0上)
  • 不同版本的MQTT库
  • 注解掉代码的某些部分:

下面是我的main.ts文件的一个片段:

const mqtt_app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.MQTT,
    options: {
        url: process.env.MQTT_URL,
        username: process.env.MQTT_USERNAME,
        password: process.env.MQTT_PASSWORD,
    },
});
mqtt_app.listen();

如果我不调用mqtt_app.listen();,我没有问题,但这也意味着与MQTT相关的任何东西都不会工作。
我的mqtt.controller文件:

import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()
export class MqttController {
    @MessagePattern(process.env.MQTT_TOPIC_1)
    async mqtt_a(@Payload() data) {
        console.log(`Received ${data} on ${process.env.MQTT_TOPIC_1}`);
        return `Received ${data} on ${process.env.MQTT_TOPIC_1}}`
    };
    @MessagePattern(process.env.MQTT_TOPIC_2)
    async mqtt_b(@Payload() data) {
        console.log(`Received ${data} on ${process.env.MQTT_TOPIC_2}`);
        return `Received ${data} on ${process.env.MQTT_TOPIC_2}}`
    }
}

如果我注解掉两个@MmessagePattern()和函数mqtt_a和mqtt_B,一切似乎都工作正常。我怀疑,当我直接使用NodeJS运行它时,它会在微服务运行之前尝试“订阅”一个主题,或者类似的东西?
也许我错过了一些非常明显的东西,但我的想法和任何帮助,这方面将不胜感激!

chhqkbe1

chhqkbe11#

问题解决!

问题是将.env用于消息模式

@MessagePattern(process.env.MQTT_TOPIC_2)

固定的,固定的

@MessagePattern('topic')

这似乎只是在使用NodeJS运行编译后的代码时才会出现问题,并且由于某些原因,在直接使用NX / NestJS运行项目时,使用process.env.* 可以正常工作。

相关问题