【发布时间】:2019-01-11 08:07:00
【问题描述】:
我启动了一个简单的代理,并添加了一个名为“myIntent”的基本 Intent。我通过 Firebase 内联编辑器启用了实现,并按照说明添加了一个名为“myFunction”的函数到提供的基础函数中。此函数包含对https://reqres.in/api/users/2 的示例 HTTPS GET 请求。
我的目标是根据对外部 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);
});
intent 被正确触发,但我的问题是代理响应总是一个空字符串。
我在 http 调用、函数回调方面没有太多经验,但我认为问题在于线路
agent.add(info);
我的脚本在 http 调用结束之前执行。
我在https://www.promisejs.org/ 之后尝试在myFunction 中插入一个promise,但它们都只携带错误消息。
各种帮助将不胜感激,我理解这个问题,但我无法以任何方式解决它。
PS:agent.handleRequest docs reference
我使用 Promise 失败的尝试
'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);
});
【问题讨论】:
-
你能修正你的第一个sn-p的缩进吗?
标签: javascript node.js callback promise dialogflow-es