Как создать свой собственный веб-хук выполнения DialogFlow с помощью модуля "dialogFlow" пакета actions-on-google? - PullRequest
0 голосов
/ 28 августа 2018

Я разрабатываю действие для действий Google и использую DialogFlow для обработки речи пользователя как намерений. Эти намерения в настоящее время выполняются с помощью веб-хука Node.js, размещенного как облачная функция Google (т.е. Firebase). Однако из-за новых требований веб-хук теперь должен быть перемещен с Firebase на сервер клиента.

Итак, мой вопрос: как я могу настроить веб-хук для запуска на сервере, отличном от Firebase?

Ниже приведен текущий (упрощенный) код для веб-хука. Выполнение всех намерений относительно просто, поэтому этот веб-хук в значительной степени основан на примере кода Google .

'use strict';

const {
  dialogflow,
  Suggestions
} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Fallback Intent', (conv) => {
    conv.ask('Please repeat');
});

app.intent('Default Welcome Intent', (conv) => {
    conv.ask('Hi, what do you wanna talk about?');
    conv.ask(new Suggestions(['fashion tips', 'celebrity news']));
});

// handlers for other intents...

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Я бы хотел сохранить как можно большую часть текущего кода (который использует dialogFlow, Suggestions и другие модули пакета actions-on-google), так как действие имеет большое количество намерений. выполняется веб-хуком.

Еще один способ задуматься над вопросом: если веб-хук обслуживается с помощью Express или http, как я могу сделать вышеупомянутые запросы к объекту приложения? А как можно написать ответы?

Я не смог найти ни одного примера, учебника или вопроса по этому конкретному вопросу. Этот вопрос похож, но автор не использует DialogFlow, как в моем случае. Документация Google также кажется немного скудной в этом отношении, фокусируясь на том, чтобы использовать веб-хук в качестве облачной функции Google.

В приведенном выше коде я попытался заменить последнюю строку (exports.dialogFlow...) на следующие биты:

const express = require('express');
const server = express();
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))

Однако при ручном выполнении POST-запроса к веб-ловушке с использованием JSON, отображаемого на вкладке симулятора «Запрос», возникает ошибка «Ошибка типа: невозможно преобразовать неопределенное или нулевое в объект», что заставляет меня думать, что какой-то заголовок или отсутствует какой-либо атрибут в теле запроса.

Я что-то упустил? Я чувствую, что, возможно, пропустил руководство или два, но, кажется, не могу найти их.

1 Ответ

0 голосов
/ 29 августа 2018

Ты довольно близко. Часть, которую вы упускаете, заключается в том, что вам нужно использовать промежуточное ПО body-parser для генерации атрибута body запроса, который будет содержать тело после анализа его как JSON.

Ваш код может выглядеть примерно так:

const express = require('express');
const bodyParser = require('body-parser');
const server = express();
server.use(bodyParser.json());
server.post('/hook', app);
server.listen(3000, () => console.log('Server listening on port 3000.'))
...