根据Dialogflow Fullfilment中API调用的结果填充意图

时间:2019-03-20 08:44:39

标签: javascript callback dialogflow

我正在努力获取以下用于Dialogflow的完整代码:

declarations: [...],
entryComponents: [ProfileComponent]

'use strict'; const functions = require('firebase-functions'); const {WebhookClient} = require('dialogflow-fulfillment'); const {Card, Suggestion} = require('dialogflow-fulfillment'); process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers)); console.log('Dialogflow Request body: ' + JSON.stringify(request.body)); function testHandler(agent){ var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; var xmlhttp = new XMLHttpRequest(); // new HttpRequest instance const proxyurl = "https://cors-anywhere.herokuapp.com/"; var theUrl = "http://xxxxx/sum?a=5&b=11"; var url = proxyurl + theUrl; var result = "Init"; getText = function(url, callback) { var request = new XMLHttpRequest(); request.onload = function() { if (request.readyState == 4 && request.status == 200) { callback(request.responseText); } }; request.open('GET', url); request.send(); } function mycallback(data) { agent.add("DATA:" + data); } return getText(url, mycallback); } let intentMap = new Map(); intentMap.set('test', testHandler); agent.handleRequest(intentMap); }); 行无效。在浏览器中尝试代码并将agent.add("DATA:" + data);更改为agent.add("DATA:" + data)时,一切正常。 我是Dialogflow的新手。任何提示为何此回调似乎无效?

1 个答案:

答案 0 :(得分:1)

进行异步操作(例如进行网络API调用)时,您的Intent处理程序必须返回一个Promise,因此Handler Dispatcher知道在将响应发送到API之前要等待API的响应。用户。在您的情况下,当响应返回时,它确实尝试将其发送给用户,但是由于响应已经发送(没有任何响应),因此没有人看到它。

您的网络浏览器正在本地处理所有内容,因此您不会看到相同的问题(即使它正在执行相同的操作)。

虽然您可以将代码包装在Promise中,但更简单的方法是使用request-promise-native之类的东西来进行HTTP调用,在agent.add()块中进行对then()的调用,并返回总体承诺。可能是这样的:

  function testHandlerPromise(agent){
    const rp = require('request-promise-native');

    const proxyurl = "https://cors-anywhere.herokuapp.com/";
    var theUrl = "http://xxxxx/sum?a=5&b=11";
    var url = proxyurl + theUrl;

    return rp( url ).then( data => {
      agent.add("DATA:" + data);
    } );
  }