我启动了一个简单的代理,并添加了一个名为
我的意图
“为了它。我通过Firebase内联编辑器启用了fulfillment,并在下面的指令中添加了一个名为“
我的功能
“到提供的基地。此函数包含对的示例HTTPS GET请求
https://reqres.in/api/users/2
.
我的目标是根据对外部API的GET调用提供的响应为我的意图添加响应。
剧本
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const https=require('https');
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 myFunction(agent){
var info='';
var options = {
host: `reqres.in`,
path: `/api/users/2`,
method: 'GET',
headers: {'Accept':'application/json'}
};
var req = https.request(options, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
let data='';
res.on('data', (d) => {
data+= d;
});
res.on('end', () => {
console.log(data);
let jsonObject= JSON.parse(data);
info=jsonObject.id;
console.log(JSON.stringify(info));
});
});
req.on('error', (e) => {
console.log('ERROR');
console.error(e);
});
agent.add(JSON.stringify(info));
req.write('End of request');
req.end();
}
let intentMap = new Map();
intentMap.set('myIntent',myFunction);
agent.handleRequest(intentMap);
});
意图被正确触发,但我的问题是代理响应始终是空字符串。
我对http调用和函数回调没有太多经验,但我认为问题在于
agent.add(info);
在我的脚本结束时,在http调用结束之前执行。
我试着在里面插入一个承诺
myFunction
下列的
https://www.promisejs.org/
,但它们都只携带错误消息。
我们会感谢你的帮助,我理解这个问题,但我无法解决它。
附笔:
agent.handleRequest docs reference
我用承诺的失败尝试
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const https=require('https');
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 myFunction(agent){
var info='';
var p=new Promise((resolve,reject)=>{
var options = {
host: `reqres.in`,
path: `/api/users/2`,
method: 'GET',
headers: {'Accept':'application/json'}
};
var req = https.request(options, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
let data='';
res.on('data', (d) => {
data+= d;
});
res.on('end', () => {
console.log(data);
let jsonObject= JSON.parse(data);
info=jsonObject.id;
console.log(JSON.stringify(info));
});
});
req.on('error', (e) => {
console.log('ERROR');
console.error(e);
});
req.write('End of request');
req.end();
resolve(info);
});
p.then((agent)=>{
agent.add(info);
});
}
let intentMap = new Map();
intentMap.set('myIntent',myFunction);
agent.handleRequest(intentMap);
});