node.js - 使用云函数模拟器在本地测试 Dialogflow 实现
问题描述
是否可以使用云功能模拟器在本地测试您的 Dialogflow 实现 webhook,如果可以,我应该如何格式化请求?
我已经阅读了我能找到的所有文档,包括https://firebase.google.com/docs/functions/local-emulator上的指南,特别感兴趣的是这个先前的问题,它似乎触及了类似的点: 在本地对 Google Dialogflow 进行单元测试操作
我可以使用函数外壳调用我的实现函数,但是无论我如何尝试格式化正文,我似乎只能触发我的后备意图或错误捕获意图。
我可以在 Google 模拟器上的 Actions 上验证,当给定输入“hello”时,我的 webhook 以默认的欢迎意图成功响应,但是当使用相同的请求 JSON 数据作为本地函数的输入时,我被定向到回退意图。
是不是函数模拟器无法在本地执行正确的意图匹配,因此总是触发回退意图,或者我只是没有格式化我的请求?任何帮助将不胜感激!
这是我正在使用的调用格式,以及来自 shell 的响应:
firebase > fulfillment({method: 'POST',json: true,body:
require("project/collabrec/testData.json")});
Sent request to function.
firebase > info: User function triggered, starting execution
info: Fallback intent triggered.
info: Execution took 15 ms, user function completed successfully
RESPONSE RECEIVED FROM FUNCTION: 200, {
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "I didn't quite catch that. Could you say that again?"
}
}
]
}
}
}
}
这是 testData.json 内容:
{
"user": {
"userId": "ABwppHFR0lfRsG_UM3NkvAptIkD2iUpIUNxFt-ia05PFuPajV6kRQKXu_H_ECMMe0lP_WcCsK64sH2MEIg8eqA",
"locale": "en-US",
"lastSeen": "2018-10-19T15:20:12Z"
},
"conversation": {
"conversationId": "ABwppHHerN4CIsBZiWg7M3Tq6NwlTWkfN-_zLIIOBcKbeaz4ruymv-nZ4TKr6ExzDv1tOzszsfcgXikgqRJ9gg",
"type": "ACTIVE",
"conversationToken": "[]"
},
"inputs": [
{
"intent": "actions.intent.TEXT",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "hello"
}
],
"arguments": [
{
"name": "text",
"rawText": "hello",
"textValue": "hello"
}
]
}
],
"surface": {
"capabilities": [
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
},
"isInSandbox": true,
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
}
],
"requestType": "SIMULATOR"
}
这是我的云功能 webhook:
const {dialogflow, Image} = require('actions-on-google');
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const app = dialogflow();
app.catch((conv, error) => {
console.log("Error intent triggered.")
console.error(error);
conv.ask('Sorry, I ran into an error. Please try that again.');
});
app.fallback((conv) => {
console.log("Fallback intent triggered.")
conv.ask("I didn't quite catch that. Could you say that again?");
})
app.intent('Default Welcome Intent', (conv) => {
console.log("Welcome intent triggered.")
conv.ask("Welcome!!");
});
exports.fulfillment = functions.region('europe-west1').https.onRequest(app);
使用 Node v8.1.4 和包版本:
"@google-cloud/common-grpc": "^0.9.0",
"@google-cloud/firestore": "^0.17.0",
"@google-cloud/functions-emulator": "^1.0.0-beta.5",
"actions-on-google": "^2.4.1",
"firebase-admin": "^6.0.0",
"firebase-functions": "^2.0.5"
解决方案
问题是您使用的是来自 AoG 模拟器的 JSON,但这显示了 AoG 发送到 Dialogflow 的 JSON。Dialogflow 对此进行处理并向您的 webhook 发送不同的 JSON,其中包括处理 AoG JSON 并确定意图、参数和其他信息的结果。
你正在做的应该工作 - 如果你有 Dialogflow JSON。你有几种方法可以做到这一点:
最直接的方法是在可以从 Dialogflow 接收 POST 并查看
conv.request
对象的地方运行您的 webhook,该对象应该能够为您提供所需的 JSON。如果您在本地开发机器上运行 webhook(如您所建议的那样),我倾向于启动一个ngrok隧道。隧道提供了一个公共的 HTTPS 服务器,这非常有用,并且具有给我一个控制台的副作用,我可以使用它来准确查看请求和响应 JSON 的内容。
最后,您应该能够进入 Dialogflow 中的项目设置并打开 Cloud Logging。该日志包括发送到您的 webhook 的请求以及您从中获得的响应。
推荐阅读
- angularjs - 在 Angular 2+ 项目中使用 AngularJS Material 组件
- php - ajax 调用给出重复数据
- python - 如何从列表中选择一个随机对象,除了一个特定的对象?
- postgresql - Postgres:从匿名jsonb数组元素中删除对象
- google-sheets - VLOOKUP 返回“7 meses”作为“12 meses”的匹配项
- java - setAdapter 使应用程序崩溃
- android - 分析屏幕并发送点击
- python - 地图函数中的 TensorFlow Dataset API 张量评估
- angularjs - 构建android时fullcalendar的离子错误
- oracle - 在oracle中匹配后提取子字符串