【问题标题】:Getting data from Firebase Database with Express使用 Express 从 Firebase 数据库获取数据
【发布时间】:2023-03-31 23:31:01
【问题描述】:

我想从 Firebase 数据库中检索数据。

我已经像这样初始化了我的 server.js

var http = require("http");

var firebase = require("firebase");
var express = require("express");
var app = express();
var routerProj = require("./routes/routes");
var bodyParser = require("body-parser");
var port = 8080; // set our port
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var server = app.listen(port);

app.use(bodyParser.json());
var config = {
  apiKey: "XXXXXXXXXXXXXXXX",
  authDomain: "datatable-18f93.firebaseapp.com",
  databaseURL: "https://datatable-18f93.firebaseio.com",
  projectId: "datatable-18f93",
  storageBucket: "datatable-18f93.appspot.com",
  messagingSenderId: "282475200118"
};
const db = firebase.initializeApp(config);
app.use("/v1", routerProj);

console.log("Server running at http://127.0.0.1:8000/");
module.exports.db = db.database(); //this doesnt have to be database only

然后在我的 router.js 中定义我的 get 路由如下:

var express = require("express"); // call express
var router = express.Router(); // get an instance of the express Router
var admin = require('firebase-admin');

router
  .route("/")
  .get(function (req, res, err) {

    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("/restau");

    // Attach an asynchronous callback to read the data at our posts reference
    ref.on("value", function (snapshot) {
      console.log(snapshot.val());
    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
    });
  });
module.exports = router;

在邮递员中,通过获取此地址的请求:http://localhost:8080/v1 我收到此错误:

错误:默认 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。

但是我已经在 server.js 中初始化了数据库连接,为什么会出现这个错误?

【问题讨论】:

    标签: javascript node.js firebase express firebase-realtime-database


    【解决方案1】:

    相信你只需要Firebase Admin SDK进行初始化,参考

    https://firebase.google.com/docs/admin/setup#add_firebase_to_your_app

    流程如下:

    var admin = require('firebase-admin');
    
    var serviceAccount = require('path/to/serviceAccountKey.json'); // Or your config object as above.
    
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount), // Or credential
      databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
    });
    

    【讨论】:

    • 这和我做的一样。在 server.js 中添加var admin = require('firebase-admin'); 并不能解决问题。我认为router.js 没有读取server.js 上的数据库初始化
    • 那为什么不导出 const db = firebase.initializeApp(config);并导入 router.js 并通用使用它
    • 谢谢我在 firebase add to project configuration 和 Admin SDK 之间感到困惑。所以我添加了你提到的,它正在工作
    • 这里还有一个问题。那是关于内存泄漏的。假设我调用了 10 次路由(内部调用了 ref.on() 函数)。然后每次我都需要调用 ref.off()。除非它会导致内存泄漏!(来源:[这里]('stackoverflow.com/questions/59210946/…))。有什么建议可以解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2020-12-22
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多