我正在使用对话框流程为Google助手制作应用。我的应用程序使用webhook(功能部署在firebase上)。 重点是 - 我想调用返回JSON的REST API URL(来自index.js),然后解析JSON Response并提取一些值。然后对该值执行一些操作并将值发送给google assistant。
代码如下:
'use strict';
process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').DialogflowApp;
const functions = require('firebase-functions');
// a. the action name from the make_name Dialogflow intent
const SOME_ACTION = 'some_action';
//----global variables-----
const http = require('https');
var body = "";
var value="";
exports.addressMaker = functions.https.onRequest((request, response) => {
const app = new App({request, response});
console.log('Request headers: ' + JSON.stringify(request.headers));
console.log('Request body: ' + JSON.stringify(request.body));
function makeMessage (app) {
var req = http.get("https://some_url_of_API", function(res)
{
res.writeHead(200, {"Content-Type": "application/json"});
res.on("data", function(chunk){ body += chunk; });
res.on('end', function()
{
if (res.statusCode === 200) {
try {
var data = JSON.parse(body);
value=data.word; //----getting the value----
} catch (e) {
console.log('Status:', res.statusCode);
console.log('Error parsing JSON!');
}
} else {
console.log('Status:', res.statusCode);
}
});
});
app.tell('Alright, your value is '+value);
}
let actionMap = new Map();
actionMap.set(SOME_ACTION, makeMessage);
app.handleRequest(actionMap);
});
我能收到消息“好吧,你的价值是”,但不是价值。我认为它不是在调用URL。
答案 0 :(得分:1)
这里有两个可能的问题。
首先,您需要使用某个付费版本的Firebase才能在Google之外进行网址调用。你可以采用“大火”计划,这需要一张信用卡,但仍有免费使用。
第二个是你的代码在回调之外调用app.tell()
来获取REST调用的结果。所以发生的事情是你正在接听电话,然后在得到结果之前立即拨打app.tell()
。
要做你想做的事,你可能想要更像这样的东西:
function makeMessage (app) {
var req = http.get("https://some_url_of_API", function(res)
{
var body = '';
res.writeHead(200, {"Content-Type": "application/json"});
res.on("data", function(chunk){ body += chunk; });
res.on('end', function()
{
if (res.statusCode === 200) {
try {
var data = JSON.parse(body);
value=data.word; //----getting the value----
// Send the value to the user
app.tell('Alright, your value is '+value);
} catch (e) {
console.log('Status:', res.statusCode);
console.log('Error parsing JSON!');
}
} else {
console.log('Status:', res.statusCode);
}
});
});
}