在Google V2 Webhook外部API上执行的操作

时间:2018-08-08 14:21:20

标签: node.js webhooks dialogflow actions-on-google

在Google V1上的“操作”中,我可以使用Webhook轻松地在api之间来回解析信息

但是V2具有不同的方法,它跳过了request()函数,只处理了conv.tell / conv.ask。

V1代码:

function helpIntent (app) {                                   
        request(API_URL, { json: true }, function (error, response, body) {
              console.log("nameIntent Response: " + JSON.stringify(response) + " | Body: " + body + " | Error: " + error);
              var msg = body.response;
              app.tell(msg);
        });                                                                  
}

V2代码:

app.intent('help', (conv) => {
      request(API_URL, { json: true }, function (error, response, body) {
           console.log("nameIntent Response: " + JSON.stringify(response) + " | Body: " + body + " | Error: " + error);
           var msg = body.response;
           conv.close(msg);
      })                                                                   
});

那么如何使conv.close(msg)V2 code中正确调用了?

1 个答案:

答案 0 :(得分:2)

问题在于request是异步操作。使用最新版本的Google动作库,如果处理程序中有异步调用,则必须返回Promise。否则,当处理程序结束时,异步函数仍将处于挂起状态,并且触发处理程序的代码不知道这一点,因此它将立即返回响应。

最简单的方法是使用request-promise-native软件包而不是request软件包。这可能会使您的代码看起来像这样:

app.intent('help', (conv) => {
  var rp = require('request-promise-native');

  var options = {
    uri: API_URL,
    json: true // Automatically parses the JSON string in the response
  };

  return rp(options)
    .then( response => {
      // The response will be a JSON object already. Do whatever with it.
      console.log( 'response:', JSON.stringify(response,null,1) );
      var value = response.msg;
      return conv.close( value );
    });
};