在回调中使用await(Microsoft Bot Framework v4 nodejs)

时间:2019-03-06 07:28:20

标签: javascript node.js botframework chatbot

我正在尝试从回调内部将响应发送回chatbot emulator

async getUserDetails(step){
    console.log("inside get userdetaiuls modeiule")
    this.userDBObject.password = step.result;

   this.userDBMethod ( async function(response){
        console.log("inside callback return");
        console.log(response);
        await step.context.sendActivity(response); // not able to do this step
        return step.endDialog();
    });
}
async userDBMethod(callback){
request.post('#', 
        {form:{key: 'hi'}}, function (error, response, body) {
        callback("done");
});
}

我得到的错误是:

  

(节点:17424)UnhandledPromiseRejectionWarning:TypeError:Cannot   对已被撤销的代理执行“获取”       在D:\ LCI \ Usecases \ statementBalance \ lionsbot-src \ bot.js:384:32       在Request._callback(D:\ LCI \ Usecases \ statementBalance \ lionsbot-src \ bot.js:410:17)       在Request.self.callback(D:\ LCI \ Usecases \ statementBalance \ lionsbot-src \ node_modules \ request \ request.js:185:22)       在Request.emit(events.js:182:13)       在Request.EventEmitter.emit(domain.js:442:20)       应要求。 (D:\ LCI \ Usecases \ statementBalance \ lionsbot-src \ node_modules \ request \ request.js:1161:10)       在Request.emit(events.js:182:13)       在Request.EventEmitter.emit(domain.js:442:20)       在IncomingMessage。 (D:\ LCI \ Usecases \ statementBalance \ lionsbot-src \ node_modules \ request \ request.js:1083:12)       在Object.onceWrapper(events.js:273:13)(node:17424)处UnhandledPromiseRejectionWarning:未处理的诺言拒绝。这个   由抛出异步函数引起的错误   没有障碍,或者拒绝了没有处理的承诺   使用.catch()。 (拒绝ID:1)(节点:17424)[DEP0018]   DeprecationWarning:已弃用未处理的承诺拒绝。在   未来,未处理的承诺拒绝将终止   具有非零退出代码的Node.js进程。

所以我该如何在回调内部使用await将响应发送回用户。 谢谢!

1 个答案:

答案 0 :(得分:0)

我建议您使用Axios(用于node.js的基于Promise的HTTP客户端)而非请求包。由于Axios基于Promise,因此您可以使用async / await代替回调。生成的代码更符合BotFramework的流程。有关更多详细信息,请参见下面的代码段和Axios Documentation

async getUserDetails(step){
    this.userDBObject.password = step.result;
    try {
        const res = await axios.post('#', {form:{key: 'hi'}});
        await step.context.sendActivity("Done");
    } catch (error) {
        console.log(error);
        await step.context.sendActivity("Sorry, we were not able to complete your request.");
    } 
    return step.endDialog();
}