我尝试将文档写入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);
});
答案 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来更好地了解其工作原理。