0

我无法实现 isRequestFromAssistant 方法来验证对我的履行 webhook 的请求。使用 Node.js,我在 index.js 文件的开头实例化以下变量:

const App = require('actions-on-google').ApiAiApp;
const app = new App({ request, response });

然后,我在整个函数中使用“app”和 .ask 和 .tell 以及其他方法。

我在文档中看到的实现 isRequestFromAssistant 的代码是:

const app = new ActionsSdkApp({request, response});
app.isRequestFromAssistant('my-project-id')
  .then(() => {
    app.ask('Hey there, thanks for stopping by!');
  })
  .catch(err => {
    response.status(400).send();
  });

如果我省略第一行并使用我现有的 app 变量,使用 .ApiAi 方法而不是 .ActionsSdkApp 方法创建,它不起作用。如果我使用 .ActionsSdkApp 方法创建一个新变量 App1 和 app1 并将上面的代码更改为 app1.isRequestFromAssistant,它也不起作用。我尝试过其他变体,但没有运气。

当我说它不起作用时,我的意思是我在调用它时收到 500 Internal Server Error。我目前正在使用 NGROK 托管它。我仍然是 Node.js 的初学者,虽然我已经设法让其他 700 行代码运行良好,主要是从 Google 搜索和阅读这些论坛中学习。

4

2 回答 2

2

您在这里发生了一些事情,这些事情单独或单独可能会导致问题。

首先- 确保您拥有最新版本的 actions-on-google 库。我相信该isRequestFromAssistant()功能是在 1.6.0 版本中添加的。

第二- 确保您正在创建正确类型的 App 实例。如果您使用的是 Dialogflow(以前的 API.AI),您应该使用类似的东西来创建它

const App = require('actions-on-google').DialogflowApp;
const app = new App( {request, response} );

或者

const { DialogflowApp } = require('actions-on-google');
const app = new DialogflowApp( {request, response} );

(它们都做同样的事情,但您会在文档中看到这两种表单。)您应该从 ApiAiApp(您的示例使用)切换到 DialogflowApp 以反映新名称,但旧表单已保留。

如果您直接使用 Actions SDK(使用 Dialogflow / API.AI),那么您应该使用 ActionsSdkApp 对象,例如

const { ActionsSdkApp } = require('actions-on-google');
const app = new ActionsSdkApp({request: request, response: response});

(同样,你会看到这方面的变体,但它们基本上都是相同的。)

第三- 确保您使用的是与您正在使用的对象匹配的正确功能。该isRequestFromAssistant()功能在您使用 Actions SDK 时提供。

如果您使用的是 Dialogflow,则对应的函数是isRequestFromDialogflow(). 但是,参数是不同的,因为它要求您将确认信息设置为 Dialogflow 配置的一部分。

最后- 如果您收到 500 错误,请检查您的日志(或 stderr 的输出)以了解正在运行的 node.js 服务器。通常会有一条错误消息指出您正确的方向。如果没有 - 将该错误消息作为 StackOverflow 问题的一部分发布总是有帮助的。

于 2017-11-27T22:26:30.210 回答
0

在 dialogflow Fulfillment 页面中设置安全(随机生成)的 auth 标头和键值,然后在 nodejs 中:

if (app.isRequestFromDialogflow("replace_with_key", "replace_with_value")) {
  console.log("Request came from dialogflow!");
  // rest of bot
} else {
  console.log("Request did not come from dialogflow!");
  response.status(400).send();
}

另请参阅:https ://developers.google.com/actions/reference/nodejs/DialogflowApp#isRequestFromDialogflow

于 2017-12-07T02:49:00.887 回答