Я разрабатываю действие для действий 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, отображаемого на вкладке симулятора «Запрос», возникает ошибка «Ошибка типа: невозможно преобразовать неопределенное или нулевое в объект», что заставляет меня думать, что какой-то заголовок или отсутствует какой-либо атрибут в теле запроса.
Я что-то упустил? Я чувствую, что, возможно, пропустил руководство или два, но, кажется, не могу найти их.