如何使用 actions-on-google 包的 "dialogFlow" 模块创建我自己的 DialogFlow fulfillment web hook?
How to create my own DialogFlow fulfillment web hook using the "dialogFlow" module of the actions-on-google package?
我正在为 Google 动作开发一个动作,我正在使用 DialogFlow 将用户的语音作为意图进行处理。这些意图目前由作为 Google 云功能(即 Firebase)托管的 Node.js 网络挂钩实现。但是,由于新的要求,现在必须将 Web 挂钩从 Firebase 移动到客户端的服务器。
所以,我的问题是:如何在 Firebase 以外的服务器上调整 Web 挂钩以适应 运行?
以下是网络挂钩的当前(简化)代码。所有意图的实现都比较简单,所以这个web hook主要基于Google's sample code.
'use strict';
const {
dialogflow,
Suggestions
} = require('actions-on-google');
const functions = require('firebase-functions');
const app = dialogflow({debug: true});
app.intent('Default Fallback Intent', (conv) => {
conv.ask('Please repeat');
});
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Hi, what do you wanna talk about?');
conv.ask(new Suggestions(['fashion tips', 'celebrity news']));
});
// handlers for other intents...
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
我想在改编中尽可能多地保留当前代码(使用 dialogFlow
、Suggestions
和 actions-on-google
包的其他模块),因为该操作有大量由网络挂钩实现的意图。
思考这个问题的另一种方式是:假设网络挂钩是使用 express 或 http 提供的,我如何才能使上述应用程序 object 处理请求?以及如何写回复?
我找不到关于这个特定问题的任何示例、教程或问题。 问题类似,但作者没有像我一样使用 DialogFlow。 Google 的文档在这方面似乎也有点稀疏,重点是将网络挂钩作为 Google 云函数提供服务。
在上面的代码中,我尝试将最后一行 (exports.dialogFlow...
) 替换为以下位:
const express = require('express');
const server = express();
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))
但是,当使用模拟器的"Request"选项卡中显示的JSON手动向web hook执行POST请求时,会出现错误"TypeError: Can not convert undefined or null to object",这使得我认为请求 body 中缺少某些 header 或某些属性。
我错过了什么吗?我觉得我可能跳过了一两个指南,但似乎找不到它们。
你很接近。您缺少的部分是您需要使用 body-parser
中间件生成请求的 body
属性,该属性将在将其解析为 JSON.[=13 后包含正文=]
您的代码可能如下所示:
const express = require('express');
const bodyParser = require('body-parser');
const server = express();
server.use(bodyParser.json());
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))
我正在为 Google 动作开发一个动作,我正在使用 DialogFlow 将用户的语音作为意图进行处理。这些意图目前由作为 Google 云功能(即 Firebase)托管的 Node.js 网络挂钩实现。但是,由于新的要求,现在必须将 Web 挂钩从 Firebase 移动到客户端的服务器。
所以,我的问题是:如何在 Firebase 以外的服务器上调整 Web 挂钩以适应 运行?
以下是网络挂钩的当前(简化)代码。所有意图的实现都比较简单,所以这个web hook主要基于Google's sample code.
'use strict';
const {
dialogflow,
Suggestions
} = require('actions-on-google');
const functions = require('firebase-functions');
const app = dialogflow({debug: true});
app.intent('Default Fallback Intent', (conv) => {
conv.ask('Please repeat');
});
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Hi, what do you wanna talk about?');
conv.ask(new Suggestions(['fashion tips', 'celebrity news']));
});
// handlers for other intents...
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
我想在改编中尽可能多地保留当前代码(使用 dialogFlow
、Suggestions
和 actions-on-google
包的其他模块),因为该操作有大量由网络挂钩实现的意图。
思考这个问题的另一种方式是:假设网络挂钩是使用 express 或 http 提供的,我如何才能使上述应用程序 object 处理请求?以及如何写回复?
我找不到关于这个特定问题的任何示例、教程或问题。
在上面的代码中,我尝试将最后一行 (exports.dialogFlow...
) 替换为以下位:
const express = require('express');
const server = express();
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))
但是,当使用模拟器的"Request"选项卡中显示的JSON手动向web hook执行POST请求时,会出现错误"TypeError: Can not convert undefined or null to object",这使得我认为请求 body 中缺少某些 header 或某些属性。
我错过了什么吗?我觉得我可能跳过了一两个指南,但似乎找不到它们。
你很接近。您缺少的部分是您需要使用 body-parser
中间件生成请求的 body
属性,该属性将在将其解析为 JSON.[=13 后包含正文=]
您的代码可能如下所示:
const express = require('express');
const bodyParser = require('body-parser');
const server = express();
server.use(bodyParser.json());
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))