当有人单击“前进”按钮时,我试图通知我的用户,但是我的firebase函数日志中不断出现一些错误。
未捕获的异常 &
提供给sendToDevice()的注册令牌必须是非空字符串或非空数组
exports.observeGoing = functions.database.ref('/going/{postId}/{uid}').onCreate((snapshot,context) => {
var postId = context.params.postId;
var uid = context.params.uid;
console.log('User: ' + uid + ' is going to your activity');
return admin.database().ref('/users/' + uid).once('value', snapshot => {
var creatorOfPost = snapshot.val();
admin.database().ref('/users/' + uid).once('value', snapshot => {
var userGoing = snapshot.val();
var payload = {
notification: {
body: userGoing.usernames + " is going",
sound: "default"
}
}
admin.messaging().sendToDevice(creatorOfPost.fcmToken, payload)
.then((response) => {
console.log('Successfully send message:', response);
return response
})
.catch((error) =>{
console.log('Error sending message:', error);
});
})
})
})
最佳答案
您重新发现该错误,因为creatorOfPost.fcmToken
可以为null
根据firebase文档,admin.messaging.Messaging.sendToDevice()的第一个参数不能为空。
但是在您的代码中,有两种违反此先决条件的可能性。creatorOfPost.fcmToken
可以为null
只需在调用admin.messaging.Messaging.sendToDevice()
之前执行null检查creatorOfPost
可以为null
firebase.database.Reference.once()返回DataSnapshot,但这并不意味着总会有相应的文档。
因此,var creatorOfPost = snapshot.val();
可以为空。
也许您可以这样检查:
return admin.database().ref('/users/' + uid).once('value', snapshot => {
if (!snapshot.exists()) {
return; // or do what you would like
}
var creatorOfPost = snapshot.val();
// ...
// ...
})