在同一 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 的页面时,您应该重新加载页面。这样每个页面只会加载一个或另一个,不会发生冲突。
我的大部分应用程序都使用 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 的页面时,您应该重新加载页面。这样每个页面只会加载一个或另一个,不会发生冲突。