![](/img/trans.png)
[英]Firebase Error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array
[英]Firebase Cloud Function error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array
我想在Firebase实时数据库中创建对象confirmGuest时向所有确认来宾的用户发送通知。
所以,我首先从confirmedGuests对象创建一个包含所有用户的数组。 然后,我遍历所有这些用户并将他们的deviceTokens推送到deviceTokens数组。 数组allDeviceTokens应该是confirmGuests中所有用户的设备令牌数组。
但是,当创建confirmGuests对象时,该函数返回错误。
下面是我的云功能
exports.sendNotification = functions.database
.ref('/feed/{pushId}/confirmedGuests')
.onCreate((snapshot, context) => {
const pushId = context.params.pushId;
if (!pushId) {
return console.log('missing mandatory params for sending push.')
}
let allDeviceTokens = []
let guestIds = []
const payload = {
notification: {
title: 'Your request has been confirmed!',
body: `Tap to open`
},
data: {
taskId: pushId,
notifType: 'OPEN_DETAILS', // To tell the app what kind of notification this is.
}
};
let confGuestsData = snapshot.val();
let confGuestItems = Object.keys(confGuestsData).map(function(key) {
return confGuestsData[key];
});
confGuestItems.map(guest => {
guestIds.push(guest.id)
})
for(let i=0; i<guestIds.length; i++){
let userId = guestIds[i]
admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {
let userData = tokenSnapshot.val();
let userItem = Object.keys(userData).map(function(key) {
return userData[key];
});
userItem.map(item => allDeviceTokens.push(item))
})
}
return admin.messaging().sendToDevice(allDeviceTokens, payload);
});
您正在从实时数据库加载每个用户的设备令牌:
admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {
此加载操作异步发生。 这意味着,当admin.messaging().sendToDevice(allDeviceTokens, payload)
调用运行时,尚未加载令牌。
要解决此问题,您需要等到所有令牌都已加载,然后再调用sendToDevice()
。 常见的方法是使用Promise.all()
let promises = [];
for(let i=0; i<guestIds.length; i++){
let userId = guestIds[i]
let promise = admin.database().ref(`/users/${userId}/deviceTokens`).once('value', (tokenSnapshot) => {
let userData = tokenSnapshot.val();
let userItem = Object.keys(userData).map(function(key) {
return userData[key];
});
userItem.map(item => allDeviceTokens.push(item))
return true;
})
promises.push(promise);
}
return Promise.all(promises).then(() => {
return admin.messaging().sendToDevice(allDeviceTokens, payload);
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.