Облачные функции Firebase Невозможно прочитать свойство 'ref' из неопределенного - PullRequest
0 голосов
/ 14 октября 2018

, когда я хочу обновить Cloud Firestore из базы данных реального времени, я развернул приведенный ниже код и получил ошибку.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const firestore = functions.firestore;

exports.onUserStatusChange = functions.database
    .ref('/status/{userId}')
    .onUpdate(event => {

        var db = admin.firestore();


        //const usersRef = firestore.document('/users/' + event.params.userId);
        const usersRef = db.collection("users");
        var snapShot = event.data;

        return event.data.ref.once('value')
            .then(statusSnap => snapShot.val())
            .then(status => {
                if (status === 'offline'){
                    usersRef
                        .doc(event.params.userId)
                        .set({
                            online: false,
                            last_active: Date.now()
                        }, {merge: true});
                }
            })
    });

TypeError: Невозможно прочитать свойство 'ref' undefined в exports.onUserStatusChange.functions.database.ref.onUpdate.event (/user_code/index.js:18:20) в cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:105:23) в cloudFunction (/ user_code / node_modules / firebase-functions / lib / cloud-functions.js: 135: 20) в /var/tmp/worker/worker.js:733:24 at process._tickDomainCallback (внутренняя / process / next_tick.js: 135: 7)

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Похоже, вы получили код для бета-версии облачных функций для Firebase.Синтаксис изменился в версии 1.0.Из документации об обновлении облачных функций :

или событий onWrite и onUpdate параметр данных имеет поля до и после.Каждый из них представляет собой DataSnapshot с теми же методами, которые доступны в admin.database.DataSnapshot.Например:

До (<= v0.9.1) </p>

exports.dbWrite = functions.database.ref('/path').onWrite((event) => {
  const beforeData = event.data.previous.val(); // data before the write
  const afterData = event.data.val(); // data after the write
});

Сейчас (> = v1.0.0)

exports.dbWrite = functions.database.ref('/path').onWrite((change, context) => {
  const beforeData = change.before.val(); // data before the write
  const afterData = change.after.val(); // data after the write
});

ИтакВы можете использовать:

  • .onUpdate((change, context) => { для объявления функции вместо .onUpdate(event => {
  • используйте change.after для ссылки на данные вместо event.data
  • используйте change.after.ref.once('value') вместо event.data.ref.once('value')

Так как кажется, что этот код в основном откуда-то скопирован, я бы рекомендовал получить оттуда обновленную версию.Например, документация Firestore, на которой, вероятно, основан ваш код, содержит обновленный пример: https://firebase.google.com/docs/firestore/solutions/presence#updating_globally

0 голосов
/ 14 октября 2018

Попробуйте изменить приведенный ниже код, так как функции firebase для событий больше не имеют двух свойств.Таким образом, ref ref:

.onUpdate((event,context) => {
 ....
return event.ref.once('value')
...

event.data больше не существует, вместо этого event.val() для больше информации и event имеет свойства, такие как

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...