首页 > 解决方案 > unscbribe 后的 mqtt.js 仍然收到来自旧侦听器的消息

问题描述

我正在使用 mqtt.js 从 mqtt 服务器接收 websocket,订阅工作正常,但我需要通过更改 websocket 的配置来动态更改主题的订阅,问题是更改配置后我开始接收来自新主题和旧主题的消息,即使在我执行 client.unsubscribe() 之后,旧侦听器仍然处于活动状态。

有没有办法删除旧的列表器或停止旧的 websocket 并只保留新的 websocket,下面是代码片段:

import React, { Component } from 'react'
import mqtt from 'mqtt';

 var options = {
              protocol: 'ws',
              rejectUnauthorized: false,
              clientId: 'clientid' ,
              username: 'username',
              password: 'password',
              clean: true
          };
 if (subscribed && (subscription != subscription1) && (subscription !=''))
                {

                    console.log("subscription != subscription1 and changing configurations");

                    console.log("previous subscription is : " , subscription)

                    console.log("New subscription is : ", subscription1)

                    client.unsubscribe(subscription, () => 
                                               
                        
                         {

                               client.end(true, () => {
                                console.log("client ended")

                                // console.log("connection status is : ", connectionStatus, "subscription is : ", subscription1);

                                console.log("subscribing to :", subscription1.toString());

                                client = mqtt.connect('ws://server:port/mqtt', options);


                                Configchanged = true;

                                client.subscribe(subscription1.toString(), (err, granted) => {

                                    if (granted) {

                                        var note = '';
                                        if (client) {

                                            client.on('message', function dispatchMqttTempMsg(topic, message) {

                                                note = message.toString();

                                                setValue(parseFloat(note));
                                                console.log("received value to listener is", note)
                                            })


                                        }

                                    }


                                    else {

                                        console.log("error during subscription", err)
                                    }

                                });



                            })                  
                    
                    
                    
                    })
                    // client.close(true)

                    
                    // console.log("unsubscribing for guage no. ", props.id, "topic : ", subscription )
                  
                            


                        }

                   
                    subscription = subscription1;

                }
                  
            }


即使成功取消订阅,上面的 client.on('message',..) 也会保持活动状态..

标签: javascriptreactjswebsocketmqtt

解决方案


取消订阅似乎无法正常工作,在订阅新主题之前,我必须执行另一个程序来取消订阅所有以前的主题,这样 websocket 侦听器将被删除,我不会收到来自旧主题的消息。


推荐阅读