Javascript Azure IoT边缘节点SDK调用的设备方法无法异步工作
我试图以异步方式返回直接方法调用的结果 我试过:Javascript Azure IoT边缘节点SDK调用的设备方法无法异步工作,javascript,node.js,azure,azure-iot-hub,azure-iot-edge,Javascript,Node.js,Azure,Azure Iot Hub,Azure Iot Edge,我试图以异步方式返回直接方法调用的结果 我试过: var client = Client.fromConnectionString(process.env.AZ_IOT_CONNECTION_STRING); var methodParams = { methodName: "method", payload: 10, // Number of seconds. responseTimeoutInSeconds: 60 }; // Call the direct method on
var client = Client.fromConnectionString(process.env.AZ_IOT_CONNECTION_STRING);
var methodParams = {
methodName: "method",
payload: 10, // Number of seconds.
responseTimeoutInSeconds: 60
};
// Call the direct method on your device using the defined parameters.
client.invokeDeviceMethod(
req.params.deviceId,
methodParams,
(err, result) => {
if (err) {
console.error(err);
} else {
console.log("success");
}
}
);
在设备上:
const method = async (request, response) => {
const longProcess = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 5000);
});
};
try {
await longProcess();
response.send(200, `success`);
} catch (error) {
response.send(500, `Error: ${error}:`);
}
};
client.onDeviceMethod("method", method);
预期:5秒后返回成功
Actual:返回“BadRequest”“errorCode:400027”,但方法执行正确。请使用promise函数,而不是回调函数,如下所示:
async deviceSyncInvoke(deviceID: string, methodName: string, data:any, responseTimeoutInSeconds?: number): Promise<[number, any]> {
try{
if (!this.client){
await this.openClient();
}
const methodParam: DeviceMethodParams = {
methodName: methodName,
payload: JSON.stringify(data)
}
// The minimum and maximum values for responseTimeoutInSeconds are 5 and 300 seconds.
//If timeout is not provided, it the default value of 30 seconds is used
if (responseTimeoutInSeconds && responseTimeoutInSeconds !== undefined) {
methodParam.responseTimeoutInSeconds = responseTimeoutInSeconds;
}
const res: ResultWithIncomingMessage<any> = await this.client.invokeDeviceMethod(deviceID, methodParam);
if (res.message.statusCode == undefined || res.message.statusCode > 299) {
throw new Error(`statusCode: ` + res.message.statusCode + `statusMessage: ` + res.message.statusMessage);
}
return [2001, "message invoking command with res: " + res];
}catch(err) {
return [5000, "error deviceSyncInvoke: " + err];
}
}
async deviceSyncInvoke(deviceID:string,methodName:string,data:any,responseTimeoutInSeconds?:number):承诺{
试一试{
如果(!this.client){
等待这个消息;
}
常量methodParam:DeviceMethodParams={
methodName:methodName,
有效负载:JSON.stringify(数据)
}
//ResponseTimeOutingSeconds的最小值和最大值分别为5秒和300秒。
//如果未提供超时,则使用默认值30秒
if(responsetimeoutionseconds&&responsetimeoutionseconds!==未定义){
methodParam.responseTimeoutInSeconds=responseTimeoutInSeconds;
}
const res:ResultWithIncomingMessage=等待this.client.invokeDeviceMethod(deviceID,methodParam);
如果(res.message.statusCode==未定义| | res.message.statusCode>299){
抛出新错误(`statusCode:`+res.message.statusCode+`statusMessage:`+res.message.statusMessage);
}
return[2001,“使用res调用命令的消息:“+res];
}捕捉(错误){
return[5000,“error deviceSyncInvoke:+err];
}
}
这并不能回答问题,这取决于您使用的SDK版本。你只是把无关紧要的东西分开。