Публикация пользовательского ввода Dialogflow в Firebase Проблема с встроенным редактором - PullRequest
0 голосов
/ 05 августа 2020

Подводя итог проблеме, с которой я столкнулся при интеграции Dialogflow с Firebase, пользовательский ввод не публикуется в Firebase / облачном хранилище FireStore, когда должен. Я собираюсь опубликовать параметр, который я назвал Locations, в коллекции, которую я назвал Location.

Сначала я следовал руководству, в котором пользователь разрешает заполнение слотов в соответствии с моим намерением. Имя намерения - Location.

Затем в Firebase я открыл базу данных, которая соответствовала моему идентификатору проекта бота, и создал коллекцию с именем идентификатора: Location.

Затем я попытался опубликовать sh пользовательский ввод для параметра (с именем Locations) с помощью встроенного редактора

пакет. json Код :

{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.12.0",
    "firebase-admin": "^9.0.0",
    "firebase-functions": "^3.9.0",
    "dialogflow": "^1.2.0",
    "dialogflow-fulfillment": "^0.6.1"
  }
}

nodejs код:

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  function getLocationHandler(agent) {
    let location = agent.parameters.location;
    db.collection("Location").add({ Location: location });
  }
  let intentMap = new Map();
  intentMap.set('Location', getLocationHandler);
  agent.handleRequest(intentMap);
});

1 Ответ

0 голосов
/ 06 августа 2020

Я думаю, что ваш код записи в базу данных неверен. Запись в Firestore работает следующим образом:

const doc = db.collection('Location').doc()
const data = {
  Location: location,
}
await doc.set(data)

Также обратите внимание, что вам нужно дождаться вызова set, поскольку он является asyn c и возвращает обещание. Для получения дополнительной информации посмотрите , как добавить данные в Cloud Firestore .

Затем вам также необходимо убедиться, что ваш обратный вызов getLocationHandler(agent), указанный в agent.handleRequest(intentMap);, также ожидает правильно, что означает:

Чтобы иметь возможность использовать await для Firestore, введите getLocationHandler(agent), getLocationHandler должно быть async. Затем вам нужно убедиться, что ваша облачная функция functions.https.onRequest(...) не выполняет fini sh до того, как getLocationHandler завершится правильно.

В зависимости от подписи agent.handleRequest (которую я к сожалению, не знаю) вы можете дождаться этого вызова или, если он принимает только обратный вызов void, вам нужно будет создать обещание раньше, завершить его в конце getLocationHandler и дождаться этого обещания в конце onRequest. Подробнее об этом см. этот вопрос .

...