首页 > 解决方案 > Cloud Functions 到 Cloud FireStore 在本地运行,但在部署时不运行

问题描述

我尝试将文档写入 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);
});

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


您将在工作完成之前发送回复。对于 HTTP 类型的函数,您必须在所有工作完成后才发送响应。Cloud Functions 将在响应发送后强制终止该函数。

请注意,get()从它派生的所有 Promise 都是异步的,这意味着它们会立即返回,只有在工作完成时才会调用回调。你不能保证什么时候会这样。

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

您只需要在确定一切都完成后发送响应。这涉及到理解代码中的 Promise 结构。

您可能想观看我关于在 Cloud Functions 中使用 Promise 的视频系列,以更好地了解它是如何工作的。


推荐阅读