Невозможно прочитать из коллекции Firestore - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть коллекция Firestore под названием Users, и я пытаюсь записать документ в коллекцию посредством выполнения.Я получаю имя пользователя и его местоположение через агента диалогового потока и пытаюсь вставить его в коллекцию.Но документ не вставляется.

1) Получение данных от агента:

name = agent.parameters.name;

location = agent.parameters.location;

2) Запись в коллекцию пожарных хранилищ Users

db.collection ("Users"). doc ("101"). set ({name: name, location: location});

Функция выполнена, но документ не вставлен в коллекцию пожарного. Что мне не хватает?

'use strict';

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

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


exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
 const agent = new WebhookClient({ request, response });
 console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
 console.log('Dialogflow Request body: ' + JSON.stringify(request.body));


var name='';
var location='';

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

 function getUserDetails(agent)
 {
     name= agent.parameters.name;
     location=agent.parameters.location;
     console.log("buyer name is " + name);
     db.collection("Users").doc("101").set({
    name: name,
    location:location});
    agent.add(`User has been inserted`);   
 }

 intentMap.set('Buy Car', getUserDetails);
 agent.handleRequest(intentMap);
})

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019
'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 saveName(agent){
    const nameParam = agent.parameters.name;
    const name = nameParam;
    agent.add(`thank you, ` + name + `!`);

  return db.collection('test').add({name: name}).then((snapshot) => {(console.log('success'));
    });
  }

  let intentMap = new Map();
  intentMap.set('Get_Name', saveName);
  agent.handleRequest(intentMap);
 });
0 голосов
/ 04 декабря 2018

Непонятно, что происходит не так, но, по крайней мере, отчасти это связано с тем, что вы не проверяете, в чем может быть ошибка при выполнении записи в коллекцию / документ.

Это составленопо вашему ответу «Пользователь был вставлен» отправляется без фактического подтверждения того, что документ пользователя был установлен.Нет даже гарантии, что она была отправлена ​​к моменту завершения функции, потому что вы не рассматриваете запись документа как асинхронную.

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

Функция, подобная этой, является более правильной и может регистрировать, что это за ошибка:

 function getUserDetails(agent)
 {
     name= agent.parameters.name;
     location=agent.parameters.location;
     console.log("buyer name is " + name);
     return db.collection("Users").doc("101").set({
       name: name,
       location: location
     })
     .then( () => {
       agent.add(`User has been inserted`);   
     })
     .catch( err => {
       console.log( err );
       agent.add('Something went wrong');
     });
 }
...