![](/img/trans.png)
[英]How do I reference Firebase Realtime data in a Cloud Messaging trigger function (to use in the title or body)
[英]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.