*图像删除
这是我的Firebase数据库,我正在尝试通过数据库中的更改或添加等事件来设置远程推送消息。
我已经进行了设置,以便多个设备可以共享同一帐户,并且每个设备作为子代写一个设备令牌,并将FCM令牌作为密钥存储在该子代下。
所以这里看到的关键值是[FCMtoken:true]
我正在弄乱Java语言的使用方式,这是我的函数返回空值,尽管我希望它返回设备FCMtoken。
exports.notificationForCommunicationAdded = functions.database.ref('/{pharmacyId}/orders/{orderId}/communications')
.onWrite(event => {
const payload = {
notification: {
title: 'New communication added',
body: 'Check it out!'
}
};
const getDeviceTokensPromise = admin.database().ref('/{pharmacyId}/userDevices/{deviceToken}').once('value');
let tokensSnapshot;
let tokens;
return getDeviceTokensPromise.then(results => {
tokensSnapshot = results;
if (!tokensSnapshot.hasChildren()) {
return console.log('There are no notification tokens to send to');
}
console.log('There are', tokensSnapshot.numChildren(), 'tokens to send to');
tokens = Object.keys(tokensSnapshot.val());
console.log('These are the tokens', tokens)
return null;
});
});
尽我所能,让我不断获得“ null”作为返回值。
非常感谢您的帮助,谢谢大家。
答案 0 :(得分:1)
访问数据库时,不能像这样进行变量替换:
admin.database().ref('/{pharmacyId}/userDevices/{deviceToken}')
这些花括号实际上是被带走的。它们不像函数定义中的通配符那样工作。您将需要使用未声明的context参数,使用通配符的值构建一个字符串。首先,您需要这样声明函数:
exports.notificationForCommunicationAdded =
functions.database.ref('/{pharmacyId}/orders/{orderId}/communications')
.onWrite((change, context) => {
请注意,第一个对象是Change对象,第二个对象是上下文。
然后,您需要使用上下文来获取通配符值的保留:
const pharmacyId = context.params.pharmacyId
const orderId = context.params.orderId
然后,您需要使用它们来构建数据库的路径:
admin.database().ref(`/${pharmacyId}/userDevices/${deviceToken}`)
答案 1 :(得分:0)
我终于可以使用以下语法:
... const pharmacyId = context.params.pharmacyId;
admin.database()。ref(/
+ pharmacyId + /userDevices
)。once('value')。then((snapshot)=> {...
出于某种原因,道格·史蒂文森(Doug Stevenson)提供的语法对我不起作用。