gpt4 book ai didi

node.js - 在每次执行时发送多个推送通知的 Firebase 函数中*返回*什么?

转载 作者:搜寻专家 更新时间:2023-11-01 00:21:04 26 4
gpt4 key购买 nike

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

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

我的问题是,为了完成对所有 Firebase Node (代表通知)的循环并完成发送所有通知,Firebase 函数应该返回什么?

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

我对 Promises 的概念理解不够,无法确定在多个推送通知的情况下返回什么。我几乎完全忘记了如何编写 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 并不是学习它的最佳方式。我建议先阅读 Firebase documentation for Web developers和/或服用 Firebase codelab for Web developer .它们涵盖了许多基本的 JavaScript、Web 和 Firebase 交互。您也可以使用 Admin SDK在本地 Node.js 进程中,可以使用本地调试器进行调试。完成这些之后,您也会更好地为 Cloud Functions 编写代码。

关于node.js - 在每次执行时发送多个推送通知的 Firebase 函数中*返回*什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45524711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com