[英]Error from Azure IoT Hub library when sending a message
Im using the Node.JS libraries for Azure IoT Hub to send some telemetry data, and intermittently I get the following error thrown from the libraries.我使用 Azure IoT 中心的 Node.JS 库来发送一些遥测数据,并且间歇性地从库中抛出以下错误。
Unhandled rejection TypeError: Cannot read property 'on' of undefined at C:\\Source\\Messenger\\app.js:156:17 at Amqp.
未处理的拒绝类型错误:无法在 Amqp 读取 C:\\Source\\Messenger\\app.js:156:17 处未定义的属性“on”。 (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:157:17) at C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:54:19 at C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:84:17 at tryCatcher (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\util.js:11:23) at Promise._settlePromiseFromHandler (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise.js:489:31) at Promise._settlePromise (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise.js:546:18) at Promise._settlePromise0 (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\prom
(C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:157:17) 在 C:\\Source\\Messenger\\node_modules\\azure-iot-device\\ node_modules\\azure-iot-common\\lib\\amqp.js:54:19 在 C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:84:17在 tryCatcher (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\util.js:11:23) at Promise._settlePromiseFromHandler (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise.js:489:31) 在 Promise._settlePromise (C :\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise.js:546:18) 在 Promise._settlePromise0 (C:\\ Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\prom ise.js:591:10) at Promise._settlePromises (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise.js:670:18) at Async._drainQueue (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js:129:16) at Async._drainQueues (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js:139:10) at Immediate.Async.drainQueues [as _onImmediate] (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js:16:14)
ise.js:591:10) 在 Promise._settlePromises (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\promise。 js:670:18) 在 Async._drainQueue (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js: 129:16) 在 Async._drainQueues (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js:139: 10) 在 Immediate.Async.drainQueues [as _onImmediate] (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async. js:16:14)
At the moment im running my scripts through forever so it recovers when the error is generated.目前我一直在运行我的脚本,以便在生成错误时恢复。
Has anyone else had this issue and managed to resolve it ?有没有其他人遇到过这个问题并设法解决了它?
My code looks like as follows我的代码如下所示
azureClient = azureDevice.Client.fromConnectionString(connectionString, azureDevice.Amqp);
var message = new azureDevice.Message(JSON.stringify('TEST MESSAGE'));
azureClient.sendEvent(message, function (err) {
if (err != null) {
Configure();
}
});
For this issue, I recommend you can use the AMQPWS or HTTP transport to send and receive messages.对于这个问题,我建议您可以使用 AMQPWS 或 HTTP 传输来发送和接收消息。 Please refer to my steps to achieve to send and receive the message:
请参考我的步骤来实现发送和接收消息:
Firstly, we should create a device and get the device id and SAS.首先,我们应该创建一个设备并获取设备 ID 和 SAS。 After created the IOT hub on Azure new portal, I ran those command on node.js command line: create IOT hub on new portal.
在 Azure 新门户上创建 IOT 中心后,我在 node.js 命令行上运行这些命令:在新门户上创建 IOT 中心。
npm install -g iothub-explorer
iothub-explorer HostName=****.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=****/****= create mydevice --connection-string
I got the result as following:我得到的结果如下:
Created device mydevice
-
deviceId: mydevice
generationId: 635881160181557968
etag: MA==
connectionState: Disconnected
status: enabled
statusReason: null
connectionStateUpdatedTime: 0001-01-01T00:00:00
statusUpdatedTime: 0001-01-01T00:00:00
lastActivityTime: 0001-01-01T00:00:00
cloudToDeviceMessageCount: 0
authentication:
SymmetricKey:
primaryKey: ****/****=
secondaryKey: ****/****=
-
connectionString: HostName=****.azure-devices.net;DeviceId=mydevice;SharedAccessKey=****/****=
Secondly, I installed the SDK on node.js project, the folder structure is same as this picture:其次,我在node.js项目上安装了SDK,文件夹结构和这张图一样:
Thirdly, I run this code on my project:第三,我在我的项目上运行此代码:
var device = require('azure-iot-device');
var connectionString = 'HostName=****.azure-devices.net;DeviceId=mydevice;SharedAccessKey=****/****=';
var client = device.Client.fromConnectionString(connectionString,device.AmqpWS);
setInterval(function () {
var windSpeed = 10 + (Math.random() * 4); // range: [10, 14]
var data = JSON.stringify({ deviceId: 'mydevice', windSpeed: windSpeed });
var message = new device.Message(data);
message.properties.add('myproperty', 'myvalue');
console.log("Sending message: " + message.getData());
client.sendEvent(message, printResultFor('send'));
}, 1000);
client.getReceiver(function (err, receiver) {
receiver.on('message', function (msg) {
console.log('Id: ' + msg.properties.messageId + ' Body: ' + msg.body);
receiver.complete(msg, function () {
console.log('completed');
// receiver.reject(msg, function() {
// console.log('rejected');
// });
// receiver.abandon(msg, function() {
// console.log('abandoned');
// });
});
receiver.on('errorReceived', function (err) {
console.warn(err);
});
});
});
function printResultFor(op) {
return function printResult(err, res) {
if (err) console.log(op + ' error: ' + err.toString());
if (res) console.log(op + ' status: ' + res);
};
}
it works fine.它工作正常。 Also if you used the "Http" transport, it also works fine.
此外,如果您使用“Http”传输,它也可以正常工作。 You need use this code:
您需要使用此代码:
var client = device.Client.fromConnectionString(connectionString);
This is the reason why I recommend you use the AMQPWS, because of this code in "azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":
这就是我推荐您使用 AMQPWS 的原因,因为
"azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":
的这段代码"azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":
if (this.uri.startsWith('wss')) {
var wsTransport = require('amqp10-transport-ws');
wsTransport.register(amqp10.TransportProvider);
}
If the URI is format with 'wss', it will be register the AMQP transport.如果 URI 的格式为“wss”,则将注册 AMQP 传输。 But AMQP transport's format is like "amqp://".
但是 AMQP 传输的格式类似于“amqp://”。 Hope this helps.
希望这可以帮助。
The Azure IoT Hub was by far a preview feature service on Azure.到目前为止,Azure IoT 中心是 Azure 上的一项预览功能服务。 And the Azure IoT device SDK for Node.js is on the fast development.
用于 Node.js 的 Azure IoT 设备 SDK 正在快速开发中。
I am trying to involve someone familiar with this topic to further look at this issue.我试图让熟悉这个主题的人进一步研究这个问题。 There might be some time delay.
可能会有一些时间延迟。
Appreciate your patience.感谢您的耐心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.