在同一 NodeJS 应用程序中使用 firebase.database() 和 admin.database()

Using firebase.database() and admin.database() in same NodeJS application

我的大部分应用程序都使用 firebase.database() 并且我只在需要提升权限的地方使用管理员。我刚刚更新到 Firebase 4.12.1,更新后,我在使用 admin.database():

时开始收到以下错误

[2018-04-16T13:45:01.042Z] @firebase/database: FIREBASE FATAL ERROR: Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.

我发现,如果我删除在 admin.database() 之前发生的对 firebase.database() 的调用,我将不再遇到该问题,但是如果我转到后续页面,则该连接确实存在用户 firebase.database(),我收到错误消息,因为连接已经存在。

这是一个错误吗,我是不是做错了什么,或者我们不能在 Firebase 4.10.0 之后的同一个节点应用程序中同时使用 firebase.database() 和 admin.database()(最后工作我有的版本)?

app.js(截断)

var config = {
  apiKey: "XXXX",
  authDomain: "XXXX",
  databaseURL: "https://XXXX.firebaseio.com",
  projectId: "XXXX",
  storageBucket: "XXXX",
  messagingSenderId: "XXXX"
};
firebase.initializeApp(config);

serviceAccount = require(path.join(__dirname, 'XXXXX.json'));
var database = firebase.database();

users.js

var express = require('express');
var router = express.Router();
var firebase = require("firebase");

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://XXXX.firebaseio.com"
});
/* GET users listing. */
router.get('/', function(req, res, next) {
  var databaseRef = admin.database().ref('navigator/users');
  var query = databaseRef.once('value').then(function(snapshot) {
    var totalUsers = 0;
    snapshot.forEach(function(element) {
      if(element.child('locations').hasChild('branson')){
        console.log(element.key);
        console.log('');
        totalUsers += 1;
      }
    });
    res.send('totalUsers' + totalUsers);
  });
});

module.exports = router;

您应该在单个页面中使用 Admin SDK 和常规 Firebase JavaScript SDK。事实上,Admin SDK 旨在用于 Node.js 项目,而不是网页。

虽然在某些情况下可以在网页中使用 Admin SDK,但我会认真考虑反对它。除非您确切知道在何处访问了什么,否则您 运行 有可能有人获得您的管理凭据并获得对您项目的完全访问权限。至少您需要在普通用户无法访问的地方托管使用 Admin SDK 的页面。

如果您继续在网页中使用 Admin SDK,则在从使用客户端 SDK 的页面过渡到使用 Admin SDK 的页面时,您应该重新加载页面。这样每个页面只会加载一个或另一个,不会发生冲突。