【问题标题】:How to access client object in 'published' callback?如何在“已发布”回调中访问客户端对象?
【发布时间】:2019-04-08 06:36:42
【问题描述】:

我使用 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);
    }
}

我想访问published 回调中的decoded_token 值,如下所示

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

});

不知何故,上面的代码没有按预期工作。我收到以下错误:

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

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

我有两个问题。

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

我是 MQTT 新手,如果问题过于幼稚,请见谅 :)

【问题讨论】:

  • client 只是一个 JS 原生对象,它通过引用传递,所以如果你在另一个中间件/函数中添加 decoded_token ,它必须在下一个中间件/函数中可以访问,所以上面的代码必须工作但是 console.log(client.decoded_token) 我使用console.log(client),它可以工作,我可以看到decoded_token 没有意义。你能把两者都控制台日志看看吗?
  • 我的错误。 console.log(client) 打印未定义。这意味着我无法在已发布的回调中访问客户端对象。

标签: javascript node.js mqtt iot mosca


【解决方案1】:
  1. 如果您可以在客户端对象中获取 decoded_token 变量。那么我们可以 通过
  2. 访问它

client.decoded_token

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

  1. 您不能将值传递给客户端对象以供下次调用。

【讨论】:

  • 写你的第2点,你是说当客户端发布到主题时我无法从客户端访问decoded_token?我的想法是将有关传感器的参数存储在令牌中,这样每当传感器发布到其主题时,我就可以读取数据和参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多