ArgumentError('对象 \'deviceInfo' 缺少属性:deviceId');我该如何解决这个问题?

Posted

技术标签:

【中文标题】ArgumentError(\'对象 \\\'deviceInfo\' 缺少属性:deviceId\');我该如何解决这个问题?【英文标题】:ArgumentError('The object \'deviceInfo' is missing the property: deviceId'); How do I solve this?ArgumentError('对象 \'deviceInfo' 缺少属性:deviceId');我该如何解决这个问题? 【发布时间】:2021-10-13 02:35:58 【问题描述】:

我正在使用 Azure IoT Hub 并尝试检索连接到我们工作场所 Hub 的真实设备(非模拟)。该项目是我们正在创建一个公司仪表板来显示和编辑来自我们的 IoT 中心的设备的各个方面。我是一名实习生,所以这确实是我第一次用 IoT Hub 做任何事情,所以请原谅我的幼稚。我正在测试只是为了在“registry.create”函数中发送有关设备的基本信息,但我一直收到上述错误。此外,我们的数据库是 Azure SQL。

这是我的部分代码。只发布必要的代码:

var iothub = require('azure-iothub');
var connectionString = '<Our connection string here>';
var registry = iothub.Registry.fromConnectionString(connectionString);

...

const device = 
    deviceId: registry.deviceId,
    devStatus: registry.status,
    connStatus: registry.connectionState


registry.create(device, function(err, deviceInfo, res) 
    if (err) 
        registry.get(device.deviceId, printDeviceInfo);
        console.log(device.deviceId);
    
    if (deviceInfo.deviceId) 
        printDeviceInfo(err, deviceInfo.deviceId, res)
    
);

function printDeviceInfo(err, deviceInfo, res) 
    if (deviceInfo) 
        console.log('Device ID: ' + deviceInfo.deviceId);
        console.log('Connection state: ' + deviceInfo.connStatus)
    

这是设备的数据库模型:

module.exports = (sequelize, Sequelize) => 
    const Device = sequelize.define('devices', 
        deviceId: 
            type: Sequelize.STRING,
            required: true
        ,
        devStatus: 
            type: Sequelize.BOOLEAN,
            allowNull: false,
            defaultValue: true
        ,
    );
    return Device;

不确定可以提供多少帮助,但我们不胜感激。关于此错误的在线信息并不多(实际上是 Google 中的两个页面,并且与我的具体问题都不相似)..

【问题讨论】:

【参考方案1】:

如果你看到source code of IOT hub SDKs,你会发现如果第一个参数不包含deviceId属性,create方法会抛出ArgumentError

因此,您的 deviceId 属性未填充。 create(DeviceDescription, HttpResponseCallback) 在 IoT 中心创建新的设备标识。您必须为其提供价值。 Registry 不提供您在代码中使用的那些属性。请参阅this 示例以正确使用registry.create。而且,我建议您阅读Understand the identity registry in your IoT hub。

如果您还有其他问题,请告诉我。

【讨论】:

你能再解释一下吗?我将如何“填充”它? 对你有帮助吗? 嗨,是的,它主要有帮助。我能够将所有设备 ID 记录到控制台中,但现在发送给 Postman 有点麻烦。我不断收到错误“在将标头发送到客户端后无法设置标头”。我的更新代码和控制台日志的屏幕截图在这里:imgur.com/a/sprvtLy 无论如何我可以给你“接受的答案”,但我真的很想跟进,因为我知道它现在非常接近。正如您在 SQL 查询的最后一行和“_http_outgoing...”之前看到的那样,在错误之前的控制台中显示了两个设备。邮递员展示了一个。 控制台在我输入“res.send”之前记录了所有设备(当然是在 Postman 中显示),但之后,我收到了我之前评论中提到的错误。 请检查您是否在向客户端发送请求后设置标头。

以上是关于ArgumentError('对象 \'deviceInfo' 缺少属性:deviceId');我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 使用ActiveRecord :: Enum时的ArgumentError

`exec':字符串包含空字节(ArgumentError)

UTF-8 中的无效字节序列 (ArgumentError)

Rails 执行迁移 ArgumentError

AIR ArgumentError: 错误 #2004: - Android

Cassandra CCM 错误:“ccmlib.common.ArgumentError”