Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dialogflow返回空响应,尽管有数据_Javascript_Node.js_Promise_Dialogflow Es_Dialogflow Es Fulfillment - Fatal编程技术网

Javascript dialogflow返回空响应,尽管有数据

Javascript dialogflow返回空响应,尽管有数据,javascript,node.js,promise,dialogflow-es,dialogflow-es-fulfillment,Javascript,Node.js,Promise,Dialogflow Es,Dialogflow Es Fulfillment,我正在尝试在DialogFlow中创建一个聊天机器人,用于检查您的保险索赔状态 我已经设置了对外部API(mock)的调用,我使用承诺等待响应,然后返回它。然而,尽管从模拟API获得了正确的数据,我还是始终从DF获得[empty response]。只是时间太长了吗 以下是相关代码: var callClaimsApi = new Promise((resolve, reject)=>{ try{ https.get('https://MOCKAPIU

我正在尝试在DialogFlow中创建一个聊天机器人,用于检查您的保险索赔状态

我已经设置了对外部API(mock)的调用,我使用承诺等待响应,然后返回它。然而,尽管从模拟API获得了正确的数据,我还是始终从DF获得
[empty response]
。只是时间太长了吗

以下是相关代码:


    var callClaimsApi = new Promise((resolve, reject)=>{
      try{
        https.get('https://MOCKAPIURL.COM', (res) => {
            res.setEncoding('utf8');
            let rawData = '';
            res.on('data', (chunk) => { rawData += chunk; });
            res.on('end', () => {
            resolve(JSON.parse(rawData));   
      });
    });} catch(e){reject(e.message);}
  }); 

  function checkClaims(agent){ 
    callClaimsApi
      .then(function(fulfillment){
        console.log("fulfillment name: " + fulfillment.name);
        agent.add("It looks like you want to find a claim for " + fulfillment.name);
      })
      .catch(function(error){console.log(error);});
  }

intentMap.set('checkClaims', checkClaims);    
以下是日志的输出:


根据文档,Dialogflow的等待时间为5秒。如果你能优化你的代码,那就太棒了。有一些技巧可以让DF使用后续事件等待更长的时间,或者使用一个意向请求->通过一些确认来响应用户(例如,您可以等待3秒钟吗?是/否)->此时请求将可用,以便您可以在下一条消息中发送它。

您可以检查

问题是,尽管您通过承诺进行所有处理,但您没有在处理程序中返回该承诺。库需要承诺,这样它就知道有一个异步操作正在进行,并且应该等到该操作完成后再发送回复

幸运的是,在您的情况下,您可以通过在
callClaimsApi
之前添加
return
语句来实现这一点


您可能还希望研究使用诸如http调用之类的库,因为它具有内置的promise支持。

我认为问题在于API调用花费的时间太长,DialogFlow想要响应并且不等待。所以,我想我要么需要加快我的通话速度,要么想办法让DialogFlow等待,无论是在代码中还是在设置中,如果可能的话……看起来通话需要2-3秒,所以这比5秒的等待时间要短,不确定为什么会失败很好,我会在这个周末测试,让你知道它是否有效。谢谢在我发布这个问题之后,在您回答之前,我已经尝试过Axios,但是这不起作用,但是您上面的解决方案符合我的要求。重要的是返回上下文。Axios只是使在基于承诺的环境中进行http调用变得更容易。很高兴有帮助!我必须检查我的历史记录,我想知道是否应该返回axios.call(XYZ).then(doThing.catch())