Облачная функция Firebase реального времени — не удается прочитать свойство нулевого снимка

#javascript #firebase #firebase-realtime-database #google-cloud-functions

#javascript #firebase #firebase-realtime-database #google-cloud-функции

Вопрос:

Я безуспешно просмотрел все похожие ответы, но по какой-то причине моя облачная функция Firebase возвращает snapshot.val() с нулевым значением. Первая консоль.журнал печатается правильно, выдавая следующее:

Пользователь: 8Ch7RGBnMrNiQlS6g8xKcDO3cr93 является следующим: WpKoFs1UgHTCZegMwjkXyXqrBTz1

Я прикреплю структуру базы данных внизу. Это ошибка, которую я получаю:

Ошибка типа: не удается прочитать свойство ‘fcmToken’ с null в admin.database.ref.once.snapshot

 exports.observeFollowing = functions.database.ref('/users/{uid}/following/{followingId}').onCreate((context) => {

var uid = context.params.uid
var followingId = context.params.followingId

console.log('User:'   uid   ' is following: '   followingId)

return admin.database().ref('/users/{followingId}').once('value', snapshot => {
    console.log(snapshot.val())
    var userWeAreFollowing = snapshot.val()
    var message = {
        notification: {
            title: "You have a new follower",
            body: "It's Tom"
        },
        token: userWeAreFollowing.fcmToken
    };
    admin.messaging().send(message)
    .then((response) => {
        console.log('Successfully sent message:', response);
        return response
    }).catch((error) => {
        console.log('Error sending message:', error);
    });
})
  

})
введите описание изображения здесь

Ответ №1:

snapshot.val() будет равно null, когда в запрошенном вами местоположении нет данных, что, безусловно, имеет место в данном случае.

Здесь указано местоположение вашего запроса «/users /{followingId}»:

 admin.database().ref('/users/{followingId}')
  

Эта строка воспринимается буквально. Здесь не происходит подстановки переменных. Если вы хотите поместить followingId в эту строку, вам нужно указать JavaScript, чтобы он сделал это правильно:

 admin.database().ref(`/users/${followingId}`)
  

Обратите внимание на обратные метки для разделителя строк и способ указания значений для включения в строку.

Вероятно, вы перепутали синтаксис заполнителя для определения функции.

Комментарии:

1. Спасибо, Дуг, однако ты уверен, что это относится к облачным функциям Firebase. Даже в их документации и десятках других примеров, на которые я смотрел, разделение строк не требуется. Использование этого метода на самом деле теперь вызывает больше ошибок, поскольку первый журнал консоли больше не печатается. firebase.google.com/docs/functions/database-events

2. Я уверен. Это распространенная ошибка. Как я сказал в самом конце ответа, вы, вероятно, перепутали синтаксис заполнителя для определения функции. Это не то же самое, что интерполяция строк JavaScript.