Cloud FireStore的Cloud Functions在本地运行,但在部署时未运行

时间:2018-09-17 09:36:22

标签: firebase google-cloud-firestore google-cloud-functions

我尝试将文档写入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 :(得分:1)

您要在工作完成之前发送回复。对于HTTP类型的函数,您必须使用send a response only after all the work is complete。发送响应后,Cloud Functions将强制终止该功能。

请注意,get()和所有从其产生的承诺都是异步的,这意味着它们会立即返回,并且仅在工作完成时才调用回调。而且您不能保证什么时候会出现。

您的代码现在正在做的是get(),然后立即跟进下一行代码,该代码在工作完成之前发送响应。发送此响应后,Cloud Functions会终止该功能,并且您的异步工作可能无法完成。

仅在确定一切完成后才发送响应。这涉及了解代码中的诺言结构。

您可能想watch my video series on using promises in Cloud Functions来更好地了解其工作原理。