firebase - 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);
});
解决方案
您将在工作完成之前发送回复。对于 HTTP 类型的函数,您必须在所有工作完成后才发送响应。Cloud Functions 将在响应发送后强制终止该函数。
请注意,get()
从它派生的所有 Promise 都是异步的,这意味着它们会立即返回,只有在工作完成时才会调用回调。你不能保证什么时候会这样。
你的代码现在正在做的是启动 a get()
,然后立即跟进下一行代码,它会在工作完成之前发送响应。发送此响应后,Cloud Functions 会终止该函数,并且您的异步工作可能无法完成。
您只需要在确定一切都完成后发送响应。这涉及到理解代码中的 Promise 结构。
您可能想观看我关于在 Cloud Functions 中使用 Promise 的视频系列,以更好地了解它是如何工作的。
推荐阅读
- javascript - 为数据集中发生的每种类型的事件计算相关性
- gnuplot - 不能更改多图模式的输出,GNUPLOT?
- powershell - 如何从批处理参数化powershell scipt
- selenium-webdriver - 如何在范围报告中打印 webdriver 侦听器日志而不是在测试用例中编写
- android - 颤动滚动项目与动画
- plugins - 在 Web 中集成 3D 模型
- python-3.x - 从数据框中绘制堆积条形图
- javascript - 使用 jsdom 和 nodeJS 加载 SpreadJS
- angular - 如何在下拉列表中设置默认第一项 - angular 2
- css - Bootstrap 4:使容器列内的对象延伸到视口边缘