我正在探索firebase云功能,并尝试使用http请求发送通知。
问题是即使我设法发送通知,请求也会一直超时。
这是我的剧本
/functions/index.jsconst functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.friendRequestNotification = functions.https.onRequest((req, res) => {
const senderId = req.query.senderId;
const recipientId = req.query.recipientId;
const getRecipientPromise = admin.database().ref(`/players/${recipientId}`).once('value');
const getSenderPromise = admin.database().ref(`/players/${senderId}`).once('value');
return Promise.all([getRecipientPromise, getSenderPromise]).then(results => {
const recipient = results[0];
const sender = results[1];
const recipientToken = recipient.child("notificationsInfo/fcmToken").val();
const notificationAuthorization = recipient.child("notificationsInfo/wantsToReceiveNotifications").val();
const recipientBadge = recipient.child("notificationsInfo/badgeNumber").val();
const senderUsername = sender.child("username").val();
const payload = {
notification: {
title: `FriendRequest`,
body: `You have a new friend request from ${senderUsername}!`,
badge: (recipientBadge+1).toString()
}
};
if (notificationAuthorization) {
return admin.messaging().sendToDevice(recipientToken, payload).then(response => {
});
}
return admin.database().ref(`/players/${recipientId}/notificationsInfo/badgeNumber`).setValue(recipientBadge+1);
});
});
另外似乎从未更新过badgeNumber,是否与超时问题有关?
答案 0 :(得分:20)
HTTP触发的云功能就像Express应用程序一样 - 您有一个响应对象(res
),您需要在请求完成时发送内容。在这种情况下,看起来你可以做类似的事情:
return Promise.all([
/* ... */
]).then(() => {
res.status(200).send('ok');
}).catch(err => {
console.log(err.stack);
res.status(500).send('error');
});
答案 1 :(得分:1)
@Michael Bleigh的答案对于这个问题非常合适,让我为将来的用户添加更多内容。
根据firebase文档:-
使用这些推荐的方法来管理您的生命周期 功能:
解析执行异步处理的功能(也称为 “后台功能”),返回一个JavaScript promise。
使用
res.redirect()
,res.send()
或res.end()
终止 HTTP函数。 (此问题的情况。)使用
return;
语句终止同步函数。
注意 管理功能的生命周期以确保其正确解析非常重要。通过正确终止函数,可以避免运行太长时间或无限循环的函数产生过多的费用。此外,您可以确保运行函数的Cloud Functions实例在函数成功达到其终止条件或状态之前不会关闭。
如果未配置结算帐户,您可能会在Firebase功能日志中看到以下警告。
未配置结算帐户。无法访问外部网络, 配额受到严格限制。配置结算帐户以删除这些 限制
检查this link以获得更多信息。