在dialogflow webhook中设置了响应,但返回未设置响应

问题描述

我正在从dialogflow调用我的dynamodb数据库。以下是意图的代码

app.intent('Survey ID',(conv) => {
    const ans = conv.parameters.any;
    let dbread = new aws.DynamoDB.DocumentClient();
    let read = function(){
      var parameters = {
          TableName: "DEV_SURVEY",Key:{
            "S_ID": ans
          }
       };
       dbread.get(parameters,function(err,data){
           if(err){
               console.log("error",JSON.stringify(err,null,2));
               conv.close('This is not a valid survey ID');
           }
           else{
               console.log("success",JSON.stringify(data,2));
               //conv.add('Hello');
               //Adding API here
            }
        })
    }
      read(); 
});

由于在日志中可见内容,因此呼叫数据工作正常。但是响应或在console.log之后编写的任何代码都导致错误错误是:

错误:未设置任何响应。这是在异步调用中使用的吗?该调用没有作为对意图处理程序的承诺返回?

解决方法

问题恰恰是错误消息所说的-您正在发出异步请求,但没有返回Promise。由于使用的是回调而不是基于Promise的响应,因此这更加复杂。回调确实完成了,所以您可以看到控制台日志,但是到它完成时,原始函数已经返回并试图发送回复给

dbread.get()返回一个AWS.Request object可以用于获取Promise。将对DynamoDB的调用处理移到Promise处理程序中,并返回Promise,它可能看起来像这样:

app.intent('Survey ID',(conv) => {
    const ans = conv.parameters.any;
    let dbread = new aws.DynamoDB.DocumentClient();
    const parameters = {
      TableName: "DEV_SURVEY",Key:{
        "S_ID": ans
      }
    };
    return dbread.get(parameters).promise()

      .then( data => {
               console.log("success",JSON.stringify(data,null,2));
               conv.add('Hello');
               //API here - make sure they continue to use Promises and .then()
      })

      .catch( err => {
        console.log("error",JSON.stringify(err,2));
        conv.close('This is not a valid survey ID');
      });
});