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版本。你只是把无关紧要的东西分开。