You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure IoT Edge模块间路由消息:自定义消息属性未传递

Azure IoT Edge 模块间消息属性读取问题排查与修复

问题根源

你的代码存在两个核心问题:

  1. 错误创建新消息对象:你在IdentityTranslation模块中,基于原消息内容新建了sensorMsg,但这个全新的Message实例不会继承原消息的属性,所以它的Properties为空。原消息的属性实际存在于接收到的msg对象中。
  2. 使用了错误的属性访问语法:你用了C#风格的Keys.Contains语法,这在NodeJS环境的Azure IoT SDK中不适用,NodeJS SDK有自己的属性操作API。

从你提供的日志能看到,原消息的propertyList已经包含了三个属性(其中就有你添加的deviceId),只是你没从正确的对象中读取。

修复方案

  • 直接从接收到的msg对象中读取属性,而不是新建消息后读取
  • 如果需要重新构造消息,要将原消息的属性拷贝到新消息中
  • 使用NodeJS SDK正确的属性访问方法:msg.properties.get('deviceId')

修正后的IdentityTranslation模块代码

moduleClient.on('inputMessage', function (inputName, msg) {
  console.log("new message received", msg);
  if (modbusClient) {
    // 从原消息中读取deviceId属性
    const deviceId = msg.properties.get('deviceId');
    console.log("deviceId ", deviceId);

    // 若需重新构造消息,拷贝原属性到新消息
    const messageContent = msg.getBytes().toString('utf8');
    const sensorMsg = new Message(messageContent);
    
    // 遍历原消息属性列表,全部拷贝到新消息
    msg.properties.propertyList.forEach(prop => {
      sensorMsg.properties.add(prop.key, prop.value);
    });

    modbusClient.sendEvent(sensorMsg);
  }
});

额外说明

  • ModbusClient模块的代码是正确的,已经成功将deviceId添加到消息属性中
  • NodeJS SDK的Properties对象常用API:
    • 读取属性:properties.get(key)
    • 添加属性:properties.add(key, value)
    • 遍历所有属性:properties.propertyList(数组形式,每个元素包含key和value)

内容的提问来源于stack exchange,提问作者ValeriaN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:22:43