从Firebase函数访问实时数据库

7

我们的移动应用程序使用Firebase函数和Firebase实时数据库。 当有人下订单时,我们会发送电子邮件,这是通过Firebase DB触发器来实现的,如下所示:

exports.on_order_received = functions.database.ref("/orders/{id}")
    .onCreate((change, context) => {
        console.log("start of on_order_received")   
...

以上触发器对我们来说运行良好。现在,我们有一些要求,其中数据库触发器不在图片中。它是一个像下面这样的HTTP请求。

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase

问题是如何在这里访问实时数据库对象?换句话说,如何访问/orders节点?我尝试过以下方式。
exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase
    var ref = functions.database.ref('orders')
    ref.orderByValue().limitToLast(3).on("value", function(snapshot) {
        snapshot.forEach(function(data) {
          console.log("The " + data.key + " dinosaur's score is " + data.val());
        });
    })

但是这并不起作用。我收到了“orderByValue()不是函数”的错误。
2个回答

14

你应该使用Firebase Admin SDK,它具有读写数据库的功能。实际上,当你编写数据库触发器时,它给你的引用实际上来自于Admin SDK,因此它是相同的API。当使用HTTP类型函数时,你只需要自己初始化它:

// at the top of the file:
const admin = require('firebase-admin');
admin.initializeApp();

// in your function:
const root = admin.database().ref();
// root is now a Reference to the root of your database.

1
我有点猜到了,但是我还有一个问题,就是它如何与数据库触发器一起工作。很高兴你也回答了这个问题。 - Vik

7

您需要使用 admin 而不是 functions 来访问 database() 以读取数据。

(请确保您已经使用适当的 importrequire 导入了 firebase-admin sdk,具体取决于您正在使用 TypeScript 还是 JavaScript)

// The Firebase Admin SDK to access the Firebase Realtime Database.    
import * as admin from 'firebase-admin';

或者
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');

试试这个:

exports.daily_sales_report = functions.https.onRequest((req, res) => {
    //query data from firebase
    /* Do not use functions */ 
    // var ref = functions.database.ref('orders')
    /* Instead use the admin */
    var ref = admin.database().ref('orders')
    ref.orderByValue().limitToLast(3).on("value", function(snapshot) {
        snapshot.forEach(function(data) {
          console.log("The " + data.key + " dinosaur's score is " + data.val());
        });
    })

orderByValue()functions.database 中没有定义 - 但实际上可以在 admin.database().ref() 中使用。


我认为这个在Admin v11中已经失效了...需要导入特定的模块(例如firebase/app,firebase/credential等)。 - milosmns
截至2022年12月,这个答案已经有4年的历史了。在stackoverflow上跟踪更新SDK的任何重大更改的答案是很困难的。正如你所指出的那样,使用新的SDK,导入必须是模块化的。 - Neelavar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接