如何使用 express 的 node js 客户端库?
How to use the node js client library with express?
我在不使用节点 js 客户端库的情况下实现了 dialogFlow 实现。我一直在手动解析请求和准备响应。现在,我想开始使用节点 js 客户端库,如下所示:https://actions-on-google.github.io/actions-on-google-nodejs/
我正在使用由 express 生成器生成的 express 框架。
这是我的一些内容 app.js:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var smarthome5 = require('./routes/smarthome5');
app.set('view engine', 'jade');
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use('/smarthome5',smarthome5);
module.exports = app;
我的 ./routes/smarthome5 包含这些:
const express = require('express')
var router = express.Router();
const {dialogflow} = require('actions-on-google')
const dfApp = dialogflow()
router.post('/', dfApp)
// Register handlers for Dialogflow intents
dfApp.intent('Default Welcome Intent', conv => {
conv.ask('Hi, how is it going?')
conv.ask(`Here's a picture of a cat`)
})
// Intent in Dialogflow called `Goodbye`
dfApp.intent('Goodbye', conv => {
conv.close('See you later!')
})
dfApp.intent('Default Fallback Intent', conv => {
conv.ask(`I didn't understand. Can you tell me something else?`)
})
module.exports = router;
但是,当我 运行 代码并向 /smarthome5 发出 POST 请求时,我收到如下错误:
SyntaxError: Unexpected number in JSON at position 1
at JSON.parse (<anonymous>)
at new User (/app/node_modules/actions-on-google/dist/service/actionssdk/conversation/user.js:75:43)
at new Conversation (/app/node_modules/actions-on-google/dist/service/actionssdk/conversation/conversation.js:73:21)
at new DialogflowConversation (/app/node_modules/actions-on-google/dist/service/dialogflow/conv.js:38:9)
at Function.<anonymous> (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:113:24)
at Generator.next (<anonymous>)
at /app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:22:71
at new Promise (<anonymous>)
at __awaiter (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:18:12)
at Function.handler (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:84:16)
当我尝试用这个替换 ./routes/smarthome5 中的 post 处理程序时:
router.post('/', function(req, res, next) {
console.log('POST ' + __filename);
console.dir(req.body, {depth: null});
})
我可以看到 POST 请求。所以我的路线正在运行,只是我不知道我是否正确使用了 dfApp。
sample post request body and error
Request body 1
originalDetectIntentRequest
headers
userStorage Field
Actions-On-Google NodeJS 客户端的 Github 页面显示了构建代理的不同方法。还有一个代码片段显示了使用 Express 开发 webhook。查看自述文件 here。都包罗万象了。
更新
给你了
'use strict';
const {dialogflow} = require('actions-on-google');
const express = require('express');
const bodyParser = require('body-parser');
const app = dialogflow();
app.intent('Default Welcome Intent', conv => {
conv.ask('Hi, Welcome to Assistant by Express JS ');
});
express().use(bodyParser.json(), app).listen(8080);
问题是您的 userStorage 已设置为字符串。该库假定此字符串为 JSON 并尝试对其进行解码。但是,库在不处理时无法处理(可能是因为它在保存时确保它是 JSON)。
解决这个问题会很困难。如果代码在生产中,您可以查看和清除用户存储,但在目录中列出之前,这是不可用的。您可以在代码中清除用户存储 - 但在初始化请求时会发生此错误,因此您需要先执行此操作。 (并且您 仅 需要在第一次为您测试过的每个用户执行此操作。)在行 router.post('/', dfApp)
中,而不是调用 dfApp
函数直接调用修改 req.body
的函数以从 JSON 中删除或重置该字段。我还没有测试过,但可能是
router.post('/', function( req, res ){
req.body.originalDetectIntentRequest.payload.user.userStorage='{}';
dfApp( req, res );
});
如果您确实需要保留该 ID(而不是仅仅生成一个新 ID),您也可以在那里这样做,但要确保该字符串是有效的 JSON 字符串。
以后,您应该将 conv.user.storage
视为一个对象。在那里存储用户 ID 可以用
之类的东西来完成
conv.user.storage.id = generateId();
(或者选择一些适合您的属性名称。)
我在不使用节点 js 客户端库的情况下实现了 dialogFlow 实现。我一直在手动解析请求和准备响应。现在,我想开始使用节点 js 客户端库,如下所示:https://actions-on-google.github.io/actions-on-google-nodejs/
我正在使用由 express 生成器生成的 express 框架。 这是我的一些内容 app.js:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var smarthome5 = require('./routes/smarthome5');
app.set('view engine', 'jade');
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use('/smarthome5',smarthome5);
module.exports = app;
我的 ./routes/smarthome5 包含这些:
const express = require('express')
var router = express.Router();
const {dialogflow} = require('actions-on-google')
const dfApp = dialogflow()
router.post('/', dfApp)
// Register handlers for Dialogflow intents
dfApp.intent('Default Welcome Intent', conv => {
conv.ask('Hi, how is it going?')
conv.ask(`Here's a picture of a cat`)
})
// Intent in Dialogflow called `Goodbye`
dfApp.intent('Goodbye', conv => {
conv.close('See you later!')
})
dfApp.intent('Default Fallback Intent', conv => {
conv.ask(`I didn't understand. Can you tell me something else?`)
})
module.exports = router;
但是,当我 运行 代码并向 /smarthome5 发出 POST 请求时,我收到如下错误:
SyntaxError: Unexpected number in JSON at position 1
at JSON.parse (<anonymous>)
at new User (/app/node_modules/actions-on-google/dist/service/actionssdk/conversation/user.js:75:43)
at new Conversation (/app/node_modules/actions-on-google/dist/service/actionssdk/conversation/conversation.js:73:21)
at new DialogflowConversation (/app/node_modules/actions-on-google/dist/service/dialogflow/conv.js:38:9)
at Function.<anonymous> (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:113:24)
at Generator.next (<anonymous>)
at /app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:22:71
at new Promise (<anonymous>)
at __awaiter (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:18:12)
at Function.handler (/app/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:84:16)
当我尝试用这个替换 ./routes/smarthome5 中的 post 处理程序时:
router.post('/', function(req, res, next) {
console.log('POST ' + __filename);
console.dir(req.body, {depth: null});
})
我可以看到 POST 请求。所以我的路线正在运行,只是我不知道我是否正确使用了 dfApp。
sample post request body and error
Request body 1
originalDetectIntentRequest
headers
userStorage Field
Actions-On-Google NodeJS 客户端的 Github 页面显示了构建代理的不同方法。还有一个代码片段显示了使用 Express 开发 webhook。查看自述文件 here。都包罗万象了。
更新
给你了
'use strict';
const {dialogflow} = require('actions-on-google');
const express = require('express');
const bodyParser = require('body-parser');
const app = dialogflow();
app.intent('Default Welcome Intent', conv => {
conv.ask('Hi, Welcome to Assistant by Express JS ');
});
express().use(bodyParser.json(), app).listen(8080);
问题是您的 userStorage 已设置为字符串。该库假定此字符串为 JSON 并尝试对其进行解码。但是,库在不处理时无法处理(可能是因为它在保存时确保它是 JSON)。
解决这个问题会很困难。如果代码在生产中,您可以查看和清除用户存储,但在目录中列出之前,这是不可用的。您可以在代码中清除用户存储 - 但在初始化请求时会发生此错误,因此您需要先执行此操作。 (并且您 仅 需要在第一次为您测试过的每个用户执行此操作。)在行 router.post('/', dfApp)
中,而不是调用 dfApp
函数直接调用修改 req.body
的函数以从 JSON 中删除或重置该字段。我还没有测试过,但可能是
router.post('/', function( req, res ){
req.body.originalDetectIntentRequest.payload.user.userStorage='{}';
dfApp( req, res );
});
如果您确实需要保留该 ID(而不是仅仅生成一个新 ID),您也可以在那里这样做,但要确保该字符串是有效的 JSON 字符串。
以后,您应该将 conv.user.storage
视为一个对象。在那里存储用户 ID 可以用
conv.user.storage.id = generateId();
(或者选择一些适合您的属性名称。)