尝试使用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运行它时,它会在微服务运行之前尝试“订阅”一个主题,或者类似的东西?
也许我错过了一些非常明显的东西,但我的想法和任何帮助,这方面将不胜感激!
1条答案
按热度按时间chhqkbe11#
问题解决!
问题是将.env用于消息模式
固定的,固定的
这似乎只是在使用NodeJS运行编译后的代码时才会出现问题,并且由于某些原因,在直接使用NX / NestJS运行项目时,使用process.env.* 可以正常工作。