如何在Express中使用Node JS客户端库?

时间:2018-08-20 07:01:48

标签: express actions-on-google

我没有使用node 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中的后处理程序时:

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

2 个答案:

答案 0 :(得分:0)

Google 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);

答案 1 :(得分:0)

问题是您的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();

(或选择一些适合您的属性名称。)