首页 文章

如何使用action-on-google软件包的“dialogFlow”模块创建自己的DialogFlow实现Web挂钩?

提问于
浏览
1

我正在开发一个针对Google Actions的Action,我正在使用DialogFlow来处理用户的语音作为意图 . 这些意图目前由作为Google Cloud Function(即Firebase)托管的Node.js web钩子实现 . 但是,由于新要求,现在必须将Web挂钩从Firebase移动到客户端的服务器 .

所以,我的问题是:我如何调整Web挂钩以在除Firebase之外的服务器上运行?

下面是Web钩子的当前(简化)代码 . 所有意图的实现都相对简单,因此这个Web钩子很大程度上基于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);

我想尽可能多地保留当前代码(使用 dialogFlowSuggestionsactions-on-google 包中的其他模块),因为动作具有Web钩子实现的大量意图 .

考虑这个问题的另一种方法是:假设使用express或http提供Web挂钩,我如何才能使上述应用程序对象处理请求?如何写出回复?

我找不到关于这个特定问题的任何示例,教程或问题 . This问题类似,但作者不使用DialogFlow,就像我的情况一样 . 在这方面,Google的文档似乎有点稀疏,专注于将Web挂钩作为Google Cloud功能提供服务 .

在上面的代码中,我尝试将最后一行( exports.dialogFlow... )替换为以下位:

const express = require('express');
const server = express();
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))

但是,当使用模拟器的“请求”选项卡中显示的JSON手动执行对Web挂钩的POST请求时,会出现错误“TypeError:无法将undefined或null转换为object”,这使我认为某些 Headers 或某些属性在请求正文中缺失 .

我错过了什么吗?我觉得我可能已经跳过一两个指南,但似乎无法找到它们 .

1 回答

  • 2

    您缺少的是,您需要使用 body-parser 中间件来生成请求的 body 属性,该属性在将其解析为JSON后将包含正文 .

    您的代码可能如下所示:

    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.'))
    

相关问题