我正在努力获取以下用于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的新手。任何提示为何此回调似乎无效?
答案 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);
} );
}