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



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

每条通知的详细信息都写在我的 Firebase 数据库中,在应发送的日期和时间下。我使用 cron 通过 http 请求触发此 Firebase 函数。

我的问题是,Firebase 函数应该返回什么才能完成遍历所有 Firebase 节点(代表通知(并完成发送所有通知?

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

我不明白承诺的想法,不足以计算出在多个推送通知的情况下要返回的内容。我也无济于事,我几乎完全忘记了如何编写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函数的同一执行中发送多个推送通知,那么我想我将不得不重新构建一些。如果是这种情况,我欢迎任何提示或示例链接以获得更好的设计。

由于此函数是由 HTTP 请求触发的,因此您无需从顶级函数返回任何内容。一旦调用send该函数就被视为已完成。

因此,您需要做的是重构代码,使其仅在发送所有通知后调用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的"新手",那么Cloud Functions for Firebase并不是学习它的最佳方式。我建议先阅读面向 Web 开发人员的 Firebase 文档和/或参加面向 Web 开发人员的 Firebase Codelab。它们涵盖了许多基本的JavaScript,Web和Firebase交互。还可以在本地 Node.js 进程中使用管理员 SDK,该进程可以使用本地调试器进行调试。在这些之后,你也会更好地为云函数编写代码。

相关内容

  • 没有找到相关文章

最新更新