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

Posted

技术标签:

【中文标题】firebase 云函数无法读取未定义的属性“ref”【英文标题】:firebase cloud functions Cannot read property 'ref' of undefined 【发布时间】:2019-03-18 22:50:26 【问题描述】:

当我想从实时数据库更新 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)

【问题讨论】:

【参考方案1】:

您似乎获得了 Cloud Functions for Firebase 测试版的代码。语法在 1.0 版本中发生了变化。来自documentation on upgrading your Cloud Functions:

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

之前(

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

【讨论】:

谢谢@Frank,这行 event.params.userId 怎么样 同页:firebase.google.com/docs/functions/…【参考方案2】:

尝试更改以下代码,因为事件的 firebase 函数不再具有两个属性。所以,参考位置是:

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

event.data 不再存在,取而代之的是 event.val() for more info 和 event 有 properties like

【讨论】:

抱歉我有同样的问题 剩余的event属性需要更新event.params.userIdcontext.auth.uid等等。尝试全部更新。 (尝试控制台记录事件、上下文和快照属性) 这段代码中的错误functions.database.ref('/status/userId') 我从本教程中得到了这段代码,一切正常,只是功能不起作用link 这里的链接,你可以使用相同的任务。这是客户端代码。所以,你也可以用它来解决它。如果你想在服务器端使用,或者在云功能上转换它。:firebase.google.com/docs/firestore/solutions/presence

以上是关于firebase 云函数无法读取未定义的属性“ref”的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数环境变量无法读取未定义的属性

Firebase TypeError:无法读取未定义的属性“val”

Firebase 函数:无法读取未定义的属性“user_id”

TypeError:无法读取未定义 Firebase 存储反应的属性“参考”

无法在下一个 js 上读取 firebase 中未定义的属性“长度”

尝试通过反应上传到 Firebase 存储。 TypeError:无法读取未定义的属性(读取'ref')