Похоже, не удается переместить данные Firestore в диалоговый поток

# #firebase #google-cloud-firestore #dialogflow-es #dialogflow-es-fulfillment

Вопрос:

У меня возникли некоторые проблемы с возвратом некоторых данных в Dialogflow из Firestore. Я могу записать значение в журнал консоли, но оно не передается агенту.add()

У меня есть коллекция продуктов, в каждом документе содержится информация о продукте:

Продукт > firebaseId >>

 {
name: "Coca Cola",
price: 1.00
}

 

ОБНОВЛЕННЫЙ КОД:

 'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {WebhookClient} = require('dialogflow-fulfillment');

process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  
  function readFromDb (agent) {
    const prodName = agent.parameters.product;
    
    const dialogflowAgentDoc = db.collection('dialogflow').where('name', '==', prodName);
    

    return dialogflowAgentDoc.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
        } else {
          agent.add('The price of '   doc.data().name   ' is '   doc.data().price   ' dollars!');
        }
        return Promise.resolve('Read complete');
      }).catch(() => {
        agent.add('Error reading entry from the Firestore database.');
        
      });
  }


  let intentMap = new Map();
  intentMap.set('priceCheck', readFromDb);
  agent.handleRequest(intentMap);
});

 

ОБНОВЛЕНИЕ: Ошибка типа больше не отображается

Но запрос истекает по времени… Я попытался сделать то же самое с базой данных RTDB и, похоже, вообще не могу выполнить запрос.

Ответ №1:

Здесь есть несколько проблем, которые могут скрывать истинную ошибку.

Почему я получаю ошибку типа?

Потому .catch() что он пытается быть вызван по вашему результату snapshot.forEach() , который ничего не возвращает. Вероятно, его следует переместить на один уровень — чтобы он был вызван в результате product.then() , что является Обещанием.

Почему вызывается console.log (), но не agent.add()?

Я думаю agent.add() , что вызывается, но из-за ошибки типа вызывается исключение, поэтому происходит неявное отклонение обещания. Поскольку существует отклонение обещания, обработчик Dialogflow фактически не добавляет никаких ответов.

Похоже, что ваш вызов agent.add() выполняется правильно, по крайней мере, на первый взгляд.

Комментарии:

1. Я получаю следующие ошибки: Ошибка выполнения dialogflowFirebaseFulfillment: Для платформы не определены ответы: DIALOGFLOW_CONSOLE в WebhookClient.send_ (/рабочее пространство/node_modules/выполнение диалогового потока/src/выполнение диалогового потока.js:488:13) в обещании. затем (/рабочее пространство/node_modules/выполнение диалогового потока/src/выполнение диалогового потока.js:306:38) в процессе. _tickCallback (внутренний/процесс/next_tick.js:68:7) При проверке диагностической информации: сбой вызова Webhook. Ошибка: DEADLINE_EXCEEDED. является ли это ошибкой, которую он мне дает