首页 > 解决方案 > 如何实现异步模式以接收来自 Azure IoT 中心 C2D 的反馈

问题描述

使用 Azure Functions,我想向 IoT Hub 发送 C2D 消息,并管理反馈消息。如何实现异步模式来管理反馈 StatusCode 消息并记录它?

const IotHubClient = require("azure-iothub").Client;
const MessageC2D = require("azure-iot-common").Message;
const connectionString = process.env.IOTHUB_CONNECTION_STRING
const serviceClientIotHub = IotHubClient.fromConnectionString(connectionString);


module.exports = async(context, IoTHubMessages) => {
 for (const message of IoTHubMessages) {
 if(message.temp > 50){
   const messagec2d = new MessageC2D(`{"state": "off"}`);
   messagec2d.ack = 'full';
   messagec2d.messageId = 'id001';

   serviceClientIotHub.getFeedbackReceiver(context,receiveFeedback);
   serviceClientIotHub.send(message.targetDevice, messagec2d, printResultFor(context, 'send'));
 }
}

function receiveFeedback (context, err, receiver){
    try {
        receiver.on('message', (context, msg) => {
            context.log('Feedback message:');
            context.log(msg.getData().toString('utf-8'));
            return msg;
        });
    } catch (e) { //UnhandledPromiseRejectionWarning: Unhandled promise rejection
        context.log(e.message);
        context.log.error('ERROR', e);
        throw e;
    }
};

function printResultFor(context, op) {
    return function printResult(err, res) {
        if (err) context.log(op + ' error: ' + err.toString());
        if (res) context.log(op + ' status: ' + res.constructor.name);
    };
}

来自本地调试的警告:

Warning: Unexpected call to 'log' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to 'done' made before function execution completes. Function name: ic_IoTHub_EventHub. Invocation Id: 824b849f-6be3-4de1-a175-bb82280ef4e1. Learn more: https://go.microsoft.com/fwlink/?linkid=2097909 

标签: node.jsazure-iot-hubazure-function-async

解决方案


推荐阅读