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

时间:2018-04-16 14:04:26

标签: node.js firebase firebase-realtime-database firebase-admin

我的大多数应用程序都在使用firebase.database(),而我只使用了admin,其中需要提升权限。我刚刚更新到Firebase 4.12.1,一旦我这样做,当我使用admin.database()时,我开始收到以下错误:

  

[2018-04-16T13:45:01.042Z] @ firebase / database:FIREBASE致命错误:   数据库初始化多次。请确保格式   数据库URL与每个database()调用匹配。

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

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

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;

1 个答案:

答案 0 :(得分:0)

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

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

如果您继续在网页中使用Admin SDK,则应在从使用客户端SDK的页面转换到使用Admin SDK的页面时使用页面重新加载。这样每个页面只会加载一个或另一个,并且冲突不会出现。