Azure IoT Edge模块间路由消息:自定义消息属性未传递
Azure IoT Edge 模块间消息属性读取问题排查与修复
问题根源
你的代码存在两个核心问题:
- 错误创建新消息对象:你在IdentityTranslation模块中,基于原消息内容新建了
sensorMsg,但这个全新的Message实例不会继承原消息的属性,所以它的Properties为空。原消息的属性实际存在于接收到的msg对象中。 - 使用了错误的属性访问语法:你用了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
相关产品推荐
相关产品推荐

