Функции Firebase Firestore: данные не возвращаются - PullRequest
0 голосов
/ 30 марта 2020

Я снова и снова пытался загрузить данные из базы данных моего пожарного хранилища из функции. Однако пожарный магазин никогда не возвращает никаких данных, и в методе showAll ничего не регистрируется. Я сократил это до самой простой формы. Все, что я делаю, это перебираю данные и печатаю их в журнал.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.migrate = functions.https.onRequest((req, res) => {
    console.log('running migrate');
    admin.firestore().collection('rooms').get().then(collection => {
      // collections.docs has no elements
      console.log('root collections', collection.docs);
      collection.docs.forEach(doc => {
        // therefore this is never called
        console.log('doc in root collection', doc);
      });
   })
   .then(obj => res.send('success'))
   .catch(error => {console.log(error); res.sendStatus(500);});
});

В пожарном депо есть данные: picture of data in cloud firestore

Я чувствую, что упускаю что-то очевидное. У меня есть другие функции, которые работают на триггерах, и они работают нормально. Это единственная функция, в которой мне не передается ссылка на документ, и это единственная функция, которая не получает данные.

Есть ли какой-то другой путь, который мне следует использовать для поиска данных? Я пропускаю часть инициализации? (Я запускаю это на сервере firebase, так как единственный способ заставить его работать локально - включить учетную запись службы в код, что я не хочу делать). Должен ли я использовать какой-то другой путь в мой пожарный магазин, кроме 'admin.firestore ()'?

спасибо за любую помощь!

1 Ответ

0 голосов
/ 30 марта 2020

Вы должны отправлять свой ответ клиенту только после завершения всей асинхронной работы. Прямо сейчас вы отправляете ответ немедленно, не дожидаясь его завершения. Когда вы возвращаете свой ответ из функции типа HTTP, Cloud Functions завершит и очистит любую асинхронную работу c, даже если она не будет выполнена.

Минимальная версия вашей функции будет выглядеть следующим образом;

exports.migrate = functions.https.onRequest((req, res) => {
    console.log('running migrate');
    admin.firestore().collection('rooms').get()
    .then(collection => {
        collection.docs.forEach(doc => {
            console.log('doc in root collection', doc);
        });
        res.send('success');
    })
    .catch(error => console.log(error));
});

Обратите внимание, что * * * res.send вызывается внутри обратного вызова после завершения запроса.

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

Короче говоря, убедитесь, что полностью понимаете, как работают обещания, иначе ваша функция может выйти из строя загадочными способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...