在每次执行中发送多个推送通知的Firebase函数中返回*的内容?

我正在使用单个的Firebasefunction向我的Android用户发送多个推送通知。

每个通知的详细信息都将写入我的Firebase数据库中的date和时间。 我使用cron通过http请求来触发此Firebasefunction。

我的问题是,Firebase函数应该如何返回以完成所有Firebase节点(代表通知)的循环并完成发送所有通知?

这是我现在所拥有的。 它在发送第一个通知之后退出。 我想要的是完成查看所有Firebase子节点并为每个节点发送通知。

我不明白Promise的想法足以找出在多个推送通知的情况下返回什么。 这也没有帮助,我几乎完全忘记了如何写javascript。

exports.sendHourlyNotifications = functions.https.onRequest((req, res) => { const dateStr = req.query.date; const hourStr = req.query.hour; console.log('sendHourlyNotifications', 'date: ' + dateStr + " hour: " + hourStr); const parentRef = admin.database().ref(); const notifRef = parentRef.child('all-notifications'); const hourRef = notifRef.child(dateStr).child(hourStr); return hourRef.once('value').then(snapshot => { const updates = {}; snapshot.forEach(function(childSnapshot) { const deviceToken = childSnapshot.child("deviceToken").val(); console.log('sendHourlyNotifications', 'childSnapshot Key: ' + childSnapshot.key); const title = childSnapshot.child("title").val(); const body = childSnapshot.child("body").val(); console.log('sendHourlyNotifications', "DeviceToken: " + deviceToken + " Title: " + title + " Body: " + body); var payload = { notification: { title: title, body: body, } }; admin.messaging().sendToDevice(deviceToken, payload); return Promise.all([ /* ... */ ]).then(() => { res.status(200).send('ok'); }).catch(err => { console.log(err.stack); res.status(500).send('error'); }); }); return parentRef.update(updates); }); }); 

如果无法在同一个Firebase函数执行中发送多个推送通知,那么我想我将不得不重新构build一下。 如果是这样,我欢迎任何提示或示例链接更好的devise。

由于该function是由HTTP请求触发的,因此不需要从顶层函数返回任何内容。 一旦你打电话sendfunction被认为是完成。

所以你需要做的是重构代码,只有在你发送所有通知后才调用send()

 return hourRef.once('value').then(snapshot => { var promises = []; snapshot.forEach(function(childSnapshot) { const deviceToken = childSnapshot.child("deviceToken").val(); const title = childSnapshot.child("title").val(); const body = childSnapshot.child("body").val(); var payload = { notification: { title: title, body: body, } }; promises.push(admin.messaging().sendToDevice(deviceToken, payload)); }); // The res.send() needs to be outside of the snapshot.forEach() callback Promise.all(promises).then(() => { res.status(200).send('ok'); }).catch(err => { console.log(err.stack); res.status(500).send('error'); }); }); 

如果您是JavaScript的“新手”,Firebase的Cloud Functions不是学习它的最佳方式。 我build议先阅读Web开发人员的Firebase文档,或者为Web开发人员提供Firebase的代码实验室 。 它们涵盖了许多基本的JavaScript,Web和Firebase交互。 您也可以在本地Node.js进程中使用Admin SDK ,可以使用本地debugging器进行debugging。 在这之后,你将会更好地为云function编写代码。