移动到 v2 API 快速自托管
Move to v2 API with express self hosting
我想在我的 dialogflow fullfilment 中使用 V2 API。
但是当我自己托管 express 时,只有 v1 有效,为什么?
使用 firebase 函数,V1 和 V2 使用相同的代码。
我应用这个:https://developers.google.com/actions/reference/nodejs/lib-v1-migration,
欢迎意图错误:
来自模拟器的请求
{
"user": {
"userId": "ABwppHHtohp6Z0QsGp9X_TSwUK3gCxdRwCZ5w3kXR-iI-aXiUSNZR3Vuo59vocUIgP80gE2qWs2SFKk-fI6g83YJjA",
"locale": "fr-CA",
"lastSeen": "2019-02-25T15:29:15Z"
},
"conversation": {
"conversationId": "ABwppHHfpVWINKIQFvk-bzrVSvu4s-8JexXgZXP7FQ-NQ5HmPAneHtGY0u86_llCV--tj3TZpMtCMIMCZakyxc7mYQ",
"type": "NEW"
},
"inputs": [
{
"intent": "actions.intent.MAIN",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "Parler avec le diable"
}
]
}
],
"surface": {
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"isInSandbox": true,
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
}
],
"requestType": "SIMULATOR"
}
来自模拟器的响应:
{
"responseMetadata": {
"status": {
"code": 10,
"message": "Failed to parse Dialogflow response into AppResponse because of empty speech response",
"details": [
{
"@type": "type.googleapis.com/google.protobuf.Value",
"value": "{\"id\":\"50104e9c-79ec-4545-a510-88ffd1944af7\",\"timestamp\":\"2019-02-25T15:32:35.568Z\",\"lang\":\"fr-ca\",\"result\":{},\"status\":{\"code\":206,\"errorType\":\"partial_content\",\"errorDetails\":\"Webhook call failed. Error: 400 Bad Request\"},\"sessionId\":\"ABwppHHfpVWINKIQFvk-bzrVSvu4s-8JexXgZXP7FQ-NQ5HmPAneHtGY0u86_llCV--tj3TZpMtCMIMCZakyxc7mYQ\"}"
}
]
}
}
}
模拟器:
有什么想法吗?
我发现了问题。这是 bodyparser 的错误配置。
这是我的代码:
import express from 'express';
import { SERVER_NAME, ENTRY_POINT, PORT } from './constants';
import { app } from './app/app';
export const server = express();
server.set('port', PORT);
server.set('trust proxy', 'loopback');
server.use(express.json({}));
server.post(ENTRY_POINT, app);
server.get('/', (req, res) => {
res.send(SERVER_NAME);
});
刚刚使用 express.use() 而不是带有 express 4.16 的正文解析器。在我看来,它解决了这个问题。现在带有 dialogflow 的 V2 API 似乎有效。
我想在我的 dialogflow fullfilment 中使用 V2 API。 但是当我自己托管 express 时,只有 v1 有效,为什么?
使用 firebase 函数,V1 和 V2 使用相同的代码。
我应用这个:https://developers.google.com/actions/reference/nodejs/lib-v1-migration,
欢迎意图错误:
来自模拟器的请求
{
"user": {
"userId": "ABwppHHtohp6Z0QsGp9X_TSwUK3gCxdRwCZ5w3kXR-iI-aXiUSNZR3Vuo59vocUIgP80gE2qWs2SFKk-fI6g83YJjA",
"locale": "fr-CA",
"lastSeen": "2019-02-25T15:29:15Z"
},
"conversation": {
"conversationId": "ABwppHHfpVWINKIQFvk-bzrVSvu4s-8JexXgZXP7FQ-NQ5HmPAneHtGY0u86_llCV--tj3TZpMtCMIMCZakyxc7mYQ",
"type": "NEW"
},
"inputs": [
{
"intent": "actions.intent.MAIN",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "Parler avec le diable"
}
]
}
],
"surface": {
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"isInSandbox": true,
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
}
],
"requestType": "SIMULATOR"
}
来自模拟器的响应:
{
"responseMetadata": {
"status": {
"code": 10,
"message": "Failed to parse Dialogflow response into AppResponse because of empty speech response",
"details": [
{
"@type": "type.googleapis.com/google.protobuf.Value",
"value": "{\"id\":\"50104e9c-79ec-4545-a510-88ffd1944af7\",\"timestamp\":\"2019-02-25T15:32:35.568Z\",\"lang\":\"fr-ca\",\"result\":{},\"status\":{\"code\":206,\"errorType\":\"partial_content\",\"errorDetails\":\"Webhook call failed. Error: 400 Bad Request\"},\"sessionId\":\"ABwppHHfpVWINKIQFvk-bzrVSvu4s-8JexXgZXP7FQ-NQ5HmPAneHtGY0u86_llCV--tj3TZpMtCMIMCZakyxc7mYQ\"}"
}
]
}
}
}
模拟器:
有什么想法吗?
我发现了问题。这是 bodyparser 的错误配置。
这是我的代码:
import express from 'express';
import { SERVER_NAME, ENTRY_POINT, PORT } from './constants';
import { app } from './app/app';
export const server = express();
server.set('port', PORT);
server.set('trust proxy', 'loopback');
server.use(express.json({}));
server.post(ENTRY_POINT, app);
server.get('/', (req, res) => {
res.send(SERVER_NAME);
});
刚刚使用 express.use() 而不是带有 express 4.16 的正文解析器。在我看来,它解决了这个问题。现在带有 dialogflow 的 V2 API 似乎有效。