我正在尝试从Firebase onUpdate的集合“用户”中查询数据更新文档“ bulkMsgs”,但是每次这样做都会出现“获取用户错误”。
两种方法都可以单独工作,但是当我将它们结合使用时,就会发生错误。
我在这里缺少什么?!
var functions = require("firebase-functions");
let admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.bulkMsg = functions.firestore
.document('/bulkMsgs/{bulkMsgsId}').onUpdate((snap, context) => {
const newValue = snap.after.data();
const regDate = newValue.regDate;
admin.firestore().collection('users').get().then(onUser => {
onUser.forEach(oneUser => {
if (oneUser.data().notification === "true") {
console.log(oneUser.id);
}
});
return true;
}).catch(err => {
console.log('Error getting user', err);
});
return true;
});
Image中CF日志中的错误。
答案 0 :(得分:1)
您将获得Error: 4 DEADLINE_EXCEEDED
。在网上快速进行search显示,这似乎在“您提出的请求花费的时间太长”时发生。
但是,关于您在上面的评论中所做的澄清,似乎您处理的不是大量邮件。
如果您返回get()
异步方法返回的promise,将会发生什么情况,如下所示。
exports.bulkMsg = functions.firestore
.document('/bulkMsgs/{bulkMsgsId}').onUpdate((snap, context) => {
const newValue = snap.after.data();
const regDate = newValue.regDate;
return admin.firestore().collection('users').get()
.then(onUser => {
onUser.forEach(oneUser => {
if (oneUser.data().notification === "true") {
console.log(oneUser.id);
}
});
return null;
}).catch(err => {
console.log('Error getting user', err);
return null;
});
});
事实上,您必须在后台触发的Cloud Function中返回Promise或值。我建议您观看Firebase视频系列中有关“ JavaScript承诺”的3个视频:https://firebase.google.com/docs/functions/video-series/,它们解释了这一要点。