如何在“已发布”回调中访问客户端对象?

时间:2019-04-08 06:36:43

标签: javascript node.js mqtt iot mosca

我正在将Mosca用作具有蚊帐后端的嵌入式MQTT代理。我主要使用Mosca作为身份验证机制,可以读取jwt令牌并从中提取一些值。我创建了自己的授权者以读取mqtt密码字段中的JWT令牌并对其进行解码/验证。解码后,我将解码后的字段添加到客户端对象,如下

authenticate(client, username, password, next) {
    try {
        const decoded_token = jwt.verify(password.toString(), process.env.SECRET_KEY_BASE);
        client.decoded_token = decoded_token;
        next(null, true);
    } catch(error) {
        console.log('name: %s, error: %s', error.name, error.message);
        console.log('unauthorized!');
        next(null, false);
    }
}

我想像下面那样访问decoded_token回调中的published

broker.on('published', (packet, client) => {
    console.log(client.decoded_token);
    console.log('Published', packet.topic, packet.payload);

});

以某种方式上述代码无法按预期工作。我收到以下错误:

TypeError:无法读取未定义的属性'decoded_token'

如果我使用console.log(client.decoded_token)而不是console.log(client),它可以工作,并且我可以在客户端对象中看到decoded_token的值。

我有两个问题。

  1. 为什么上面的代码不起作用?
  2. 当我将值存储在客户端对象中时,该值是否传递给客户端(传感器),可以随后续请求一起发送?还是仅存储在本地内存中?

我是MQTT的新手,如果问题太幼稚,请原谅:)

1 个答案:

答案 0 :(得分:1)

  1. 如果您可以在客户端对象中获取decoded_token变量。然后我们可以 通过
  2. 访问
  

client.decoded_token

如果您使用vs代码或Webstrom进行开发,则可以使用内置调试器来调试和打印客户端对象。

  1. 您不能将值传递给下一个调用的客户端对象。