【问题标题】:Using firebase.database() and admin.database() in same NodeJS application在同一个 NodeJS 应用程序中使用 firebase.database() 和 admin.database()
【发布时间】:2018-04-16 14:04:25
【问题描述】:

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

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

我发现,如果我删除在 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;

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我应该说路线而不是页面。我只在客户端应用程序上使用 Firebase Javascript SDK。在我的服务器端应用程序上,我一直在使用这两者。我应该只在 NodeJS 中使用 Admin SDK,而从不在 NodeJS 中使用 firebase.database() 吗?
    • 确实,我希望 Node.js 服务器上只有 Admin SDK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-10-01
    • 2013-01-24
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多