移动到 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 似乎有效。