#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.