当有人单击“前进”按钮时,我试图通知我的用户,但是我的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);
  });
})
})
})


javascript - 当按钮单击错误时发送通知-LMLPHP

最佳答案

您重新发现该错误,因为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();
  // ...
  // ...
})

10-04 16:01