首页 > 解决方案 > 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连接问题,但我不知道如何解决,因为我对这两个都是新手。

有什么帮助吗?

标签: node.jssocket.iomqtt

解决方案


推荐阅读