【问题标题】:How to use the node js client library with express?如何将 node js 客户端库与 express 一起使用?
【发布时间】:2018-08-31 19:28:47
【问题描述】:

我在没有使用 node js 客户端库的情况下实现了一个 dialogFlow 实现。我一直在手动解析请求并准备响应。现在,我想开始使用 node 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

【问题讨论】:

  • 你能显示 req.body 的内容吗? (或者至少是它的前几个字符?)
  • 我已经编辑了我的帖子以包含:)
  • 显示标题,但不显示正文。由于错误与 JSON 正文有关,因此我们需要查看它以帮助弄清楚发生了什么。
  • 我的错。我已经包含了请求正文第一部分的快照
  • 好的,至少这是一个好兆头。您能否在originalDetectIntentRequest 下包含包含user 对象的请求正文部分?

标签: express actions-on-google


【解决方案1】:

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

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

【讨论】:

  • 哇!这看起来很有希望。我会试试这个!谢谢。
  • 希望对您有所帮助!如果是这样,接受和/或支持答案总是值得赞赏的。
  • 你就是男人!我今天才有时间测试它。它超级有效!非常感谢,伙计!极好的!事实证明,错误消息是现场的。谢谢。谢谢! (我的赞成票似乎还没有被计算在内)
【解决方案2】:

Actions-On-Google NodeJS 客户端的 Github 页面显示了构建代理的不同方法。还有一段代码 sn-p 展示了使用 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);

【讨论】:

  • 谢谢。该链接是我一直关注的。但由于我是 node js 和 express 的新手,我似乎无法正确遵循它。我使用正确吗? const dfApp = dialogflow()
  • 谢谢!在 node js 中使用 express 时,是否相当于:const express = require('express') var router = express.Router(); const {dialogflow} = require('actions-on-google') const dfApp = dialogflow() router.post('/', dfApp) module.exports = router;
  • 我的快递后端做了一些其他的事情。这就是我使用路线的原因。在我的原始帖子中,我的代码与您的更新非常相似。但它不起作用:(
  • 您是否检查了以下github.com/actions-on-google/actions-on-google-nodejs/issues/…。一个例子是使用路由器
  • 是的。我做到了。我在寻找可能的解决方案时遇到了这个问题。它产生相同的错误:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多