node.js - socket io 和 mqtt nodejs 重复条目
问题描述
我在我的 nodejs 后端使用 mqttjs 和 socketio。我使用 Angular 作为我的前端框架。
在我的前端有 3 条路线。所有这些都需要套接字连接以获取实时数据。因此,在 ngOnInit 上我运行客户端套接字 io 连接代码,在 ngOnDestroy 上我也将运行套接字断开连接。
在我的服务器端代码(index.js)中,主要发生了 3 个动作。
const io = require('socket.io')(server)
mqtt.createConnection();
mqtt.mqttSubscriptions(io);
mqtt.mqttMessages(io);
这些是 mqtt 方法:
const createConnection = () => {
let options = {
protocol: 'mqtt',
clientId: process.env.MQTT_CLIENT_ID,
username: process.env.MQTT_USERNAME,
password: process.env.MQTT_PASSWORD,
};
client = mqtt.connect(process.env.MQTT_HOST, options);
client.on('connect', function() {
winston.info('MQTT connected');
});
client.on('error', function(err) {
winston.error(err);
});
};
const mqttSubscriptions = io => {
winston.info(`Socket connected.`);
client.subscribe([TOPICS.DATA], function(error, granted) {
if (error) {
winston.error(error);
}
winston.info('Topics: ', granted);
});
};
const mqttMessages = io => {
io.sockets.on('connection', socket => {
winston.info(`Socket connected.`);
client.on('message', function(topic, message) {
let payload = JSON.parse(message.toString());
winston.info(topic);
winston.info(payload.id);
switch (topic) {
case TOPICS.DATA:
dataController.storeData(payload, io);
break;
default:
winston.error('Wrong topic');
break;
}
});
});
};
在我正在运行的数据控制器上
socket.emit()
我的问题是每次我导航到一条路线并返回时dataController.storeData
都会被多次调用。
那就是当我在路线 A 处,然后导航到路线 B,然后返回 A,然后再到 C,数据会乘以我的路线导航的许多倍。(在这种情况下为 4 次。)
我发现这是socket io和mqtt连接问题,但我不知道如何解决,因为我对这两个都是新手。
有什么帮助吗?
解决方案
推荐阅读
- java - 该模块尚未部署:Tomcat 9
- cmake - 编译依赖于 PCL 的东西时找不到用于编译 PCL 的依赖项
- angular - 如何在 Angular 12 中更改 ngx-monaco-editor 的背景颜色?
- css - 检测 Css 更改时的 Wordpress SLOW
- javascript - JS中的这些日期字符串是什么类型的?
- macos - Dockerfile 不会仅将文件写入主机到容器
- reactjs - 不能在 React 动态导入中使用模板文字?
- javascript - 在谷歌标签管理器中返回点击类的内部html的函数
- hibernate - 休眠示例的问题 - 找不到配置文件
- javascript - Django/Javascript - 如何为受保护的资源生成链接?