【问题标题】:Response is set in dialogflow webhook but it returns that no response has been set在 dialogflow webhook 中设置了响应,但它返回未设置响应
【发布时间】:2020-08-25 09:21:26
【问题描述】:

我正在从 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,null,2));
               //conv.add('Hello');
               //Adding API here
            }
        })
    }
      read(); 
});

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

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

【问题讨论】:

    标签: node.js amazon-dynamodb dialogflow-es actions-on-google dialogflow-es-fulfillment


    【解决方案1】:

    问题正是错误消息所说的 - 您正在发出异步请求,但您没有返回 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,null,2));
            conv.close('This is not a valid survey ID');
          });
    });
    
    

    【讨论】:

    • 如果 ans 仅与 S_ID 匹配,那么它将转到 .then(data) 函数。如果不是,它应该去抓吗?但是当我输入一个与数据库中的 S_ID 不匹配的 ID 时,它仍然在打招呼
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多