我有一个使用node.js的云函数,每次在一个特定节点上添加一个子节点时,它都会监听,然后向用户发送一个通知。但是,当我在数据库上添加了一些东西时,它不会发送任何东西。我正在开发android studio java。如果它只监听数据库,然后在设备令牌上发送FCM消息,我是否应该将该函数连接到android studio。
还有如何在这上面调试,我用的是VS代码。
这是我的代码:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.listen = functions.database.ref("/Emergencies/{pushId}")
.onCreate(async (change, context) => {
change.after.val();
context.params.pushId;
// Get the list of device notification tokens. Note: There are more than 1 users in here
const getDeviceTokensPromise = admin.database()
.ref("/Registered Admins/{uid}/Token").once("value");
// The snapshot to the user's tokens.
let tokensSnapshot;
// The array containing all the user's tokens.
let tokens;
const results = await Promise.all([getDeviceTokensPromise]);
tokensSnapshot = results[0];
// Check if there are any device tokens.
if (!tokensSnapshot.hasChildren()) {
return functions.logger.log(
'There are no notification tokens to send to.'
);
}
functions.logger.log(
'There are',
tokensSnapshot.numChildren(),
'tokens to send notifications to.'
);
// Notification details.
const payload = {
notification: {
title: "New Emergency Request!",
body: "Someone needs help check Emergenie App now!",
}
};
// Listing all tokens as an array.
tokens = Object.keys(tokensSnapshot.val());
// Send notifications to all tokens.
const response = await admin.messaging().sendToDevice(tokens, payload);
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
functions.logger.error(
'Failure sending notification to',
tokens[index],
error
);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
1条答案
按热度按时间cdmah0mi1#
这似乎是在拧:
这个字符串中的
{uid}
没有在任何地方定义,并且也将被视为一个字符串,而不是用户的ID-我希望这是你想要的。更可能的情况是,您需要:
1.加载所有
/Registered Admins
1.循环遍历从该函数得到的结果
1.获取其中每个的
Token
值如果你是JavaScript新手,Firebase的Cloud Functions并不是学习它的最简单的方法。我建议你首先在本地Node.js进程中使用Admin SDK,或者使用模拟器套件,它可以用本地调试器进行调试。之后,你将更好地准备将代码移植到你的Cloud Functions中。