我正试图在我的firestore Cloud Function触发器事件中查询另一个集合,但它总是不返回任何信息,但当我尝试在该firestore触发器事件中进行查询时,它可以
看看
exports.newTicketNotification = functions.firestore
.document('tickets/{refNo}')
.onCreate(async (snap, context) => {
//get user
const user = snap.data().ticketOwnerUid
// Here i tried to query a collection called fcmTokens(Where my fcmTokens are stored)
// this returned no matching documents
// but if i use this db.collection('tickets').where('tickeOwnerUid', '==', user).get() it works
db.collection('fcmTokens').where('userUid', '==', user).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
return;
}
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
});
})
.catch(err => {
console.log('Error getting documents', err);
});
});
我正在使用它,这样我就可以获得设备的fcm令牌并向他们发送通知。这样做对吗?或者你们可以推荐一个更好的方式提前谢谢;(Ps.我被困了2天:(
请注意,您同时使用async/await
和then()
。
以下内容应该有效:
exports.newTicketNotification = functions.firestore
.document('tickets/{refNo}')
.onCreate((snap, context) => { //Note that we have removed async
const db = admin.firestore();
//get user
const user = snap.data().ticketOwnerUid
// Here i tried to query a collection called fcmTokens(Where my fcmTokens are stored)
// this returned no matching documents
// but if i use this db.collection('tickets').where('tickeOwnerUid', '==', user).get() it works
return db.collection('fcmTokens').where('userUid', '==', user).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
return;
}
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
//If you plan to call asynchronous methods, you should probably use Promise.all
});
return;
})
.catch(err => {
console.log('Error getting documents', err);
return;
});
});
注意我们是如何返回Promises链的,因为Cloud函数是后台触发的。我建议您观看Firebase系列视频中关于"JavaScript承诺"的3个视频:https://firebase.google.com/docs/functions/video-series/从而解释了这一关键点。