繁体   English   中英

如何从云 function 中引用 Firebase 的实时数据库?

[英]How do i reference Firebase's realtime database from within a cloud function?

在 Firebase Cloud function 中,我正在尝试从我的实时数据库中检索数据并向其写入更新。 这是我遇到麻烦的地方。

function:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();
...

api.post('/messages/add', (request: any, response: any) => {

  const dbRef:any = functions.database.ref(`count/${request.body.chatRoomId}`);

  dbRef.once('value').then((snapshot:any) => {
      let messageCount:number = (snapshot.val() && snapshot.val().messages) || 0;
      messageCount = Number(messageCount + 1);
      dbRef.update({
        messages: messageCount,
        updated: admin.database().database.ServerValue.TIMESTAMP
      });
  });

});

当我从客户端调用此 function 时,在 firebase 云控制台日志中,我看到以下错误:

TypeError: dbRef.once is not a function

我尝试通过以下每种方式引用数据库,但都失败了:

functions.database.ref(`count/${request.body.chatRoomId}`).once('value').then((snapshot)) =>

functions.database.ref(`count/${request.body.chatRoomId}`).once('value', (snapshot) =>

admin.database().ref(`count/${request.body.chatRoomId}`).once('value').then((snapshot)) =>

admin.database().ref(`count/${request.body.chatRoomId}`).once('value', (snapshot) =>

当尝试通过admin.database()使用 Admin SDK 进行引用时,我得到一个不同的错误:

TypeError: Cannot read property 'ServerValue' of undefined
    at dbRef.once.then

最后,我可以确认${request.body.chatRoomId}的值正在正确解析,我已经通过将其值打印到控制台来对此进行了测试。

此处的答案显示了如何从实时数据库侦听器(例如onWrite()中的“事件”响应中引用实时数据库,但是我的 function 不是由实时数据库更改触发的,而是可以从客户端访问的端点。

更新

下面 Doug Stevenson 提出的答案是正确的,但是由于尝试将时间戳错误地写入我最初排除的字段而导致我的 function 尽管尝试了他的解决方案但失败,因此还有一个额外的错误,因此我更新了代码来反映这一点。

首先,答案是使用admin.database()引用实时数据库

其次,即使我已经尝试过了,我仍然看到一个错误,但该错误是由于尝试错误地设置时间戳造成的。 感谢Frank van Puffelen指出这一点。

这: admin.database().database.ServerValue.TIMESTAMP

需要是: admin.database.ServerValue.TIMESTAMP

有了它,它就可以工作了。

您在尝试使用函数 SDK 查询数据库时犯了错误。 这实际上并没有创建数据库引用:

functions.database.ref(`count/${request.body.chatRoomId}`);

函数 SDK 仅用于声明和配置 Cloud Functions。

您应该做的是使用 Admin SDK 创建引用,然后查询它:

admin.database().ref(...).once(...)

您还需要在使用之前将 Admin SDK 初始化一次:

admin.initializeApp();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM