开发者问题收集

firebase 云函数无法读取未定义的属性“ref”

2018-10-14
3514

当我想从实时数据库更新 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” 在 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 在 process._tickDomainCallback (internal/process/next_tick.js:135:7)

2个回答

您似乎获得了 Cloud Functions for Firebase 测试版的代码。语法在 1.0 版中发生了变化。从 升级 Cloud Functions 的文档 中可以看出:

或者 onWrite 和 onUpdate 事件,数据参数具有 before 和 after 字段。每个都是 DataSnapshot,具有 admin.database.DataSnapshot 中可用的相同方法。例如:

Before (<= v0.9.1)

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
});

Now (>= 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

Frank van Puffelen
2018-10-14

尝试更改以下代码,因为事件上的 Firebase 函数不再具有两个属性。因此,引用位置为:

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

event.data 不再存在,取而代之的是 event.val() ,用于 更多信息 ,并且 event 具有 类似 的属性

Cappittall
2018-10-14