如何在google助手的(index.js)webhook中调用REST API

时间:2018-03-30 09:58:20

标签: firebase webhooks actions-on-google dialogflow

我正在使用对话框流程为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。

1 个答案:

答案 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);

            }

          });

        });

  }