Облачные функции в Cloud FireStore работают локально, но не при развертывании - PullRequest
0 голосов
/ 17 сентября 2018

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

const functions = require('firebase-functions');
const admin = require('firebase-admin');

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

exports.update = functions.https.onRequest((request, response) => {
        db.collection('emails').doc(request.query.trackingid).get()
        .then( doc => {
            if (!doc.exists) {
                console.log('No such document!');
              } else {
                var viewRef = db.collection('emails').doc(request.query.trackingid).collection('views');
                var view = {
                    when: (new Date()).toUTCString()
                };
                viewRef.add(view)
                .then(ref => {
                    console.log("Document added");
                    return;
                }).catch(err => {
                    console.log("Document creation failed", err);
                });
              }
              return;
        }).catch((err) => {
            console.log('Tracking ID not found', err);
            return;
        });
        response.sendStatus(200);
});

1 Ответ

0 голосов
/ 17 сентября 2018

Вы отправляете ответ до завершения работы.Для функций типа HTTP вы обязаны отправлять ответ только после того, как вся работа завершена .Облачные функции принудительно завершат функцию после отправки ответа.

Обратите внимание, что get() и все полученные из него обещания являются асинхронными, то есть возвращаются немедленно, а обратные вызовы вызываются только при выполнении работы.завершено.И у вас нет никаких гарантий относительно того, когда это произойдет.

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

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

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

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