我正在使用将Firebase用作数据库的应用程序。我们仅在后端(基于Node Express构建的REST API)上使用firebase-admin进行需要管理员权限的操作,例如用户身份验证,用户帐户删除等。假设我们有一个端点,例如:
app.post('/auth/user/signin', function(req, res){
const ev = req.body;
const email = ev.email;
const password = ev.password;
firebaseAdmin.initializeApp({
credential: {some admin creds}),
databaseURL: {some database URL}
});
return someFirebaseAuthQuery()
.then(() => {
// Some auth related code
...
...
...
firebaseAdmin.auth().app.delete();
return res.
status(some status).
json(some data);
})
});
Run Code Online (Sandbox Code Playgroud)
我们面临的问题是,当两个用户同时发出登录请求时,firebaseAdmin.initializeApp()会被调用两次(每个用户一次),这将引发错误,提示已存在类似Firebase App的错误。任何想法如何解决这个问题?
您不应在每次收到请求时都创建一个实例。如果您正在运行Express应用程序,则这不是正确的方法。尽管如果您将应用程序托管在云功能上,那么它将运行良好。
这里的错误是您尝试使用相同的名称两次初始化Firebaze admin应用程序,即“默认”
如果您可以看到initializeApp的定义带有两个参数,并且仅给出一个参数,那么默认情况下它将以“默认”作为名称。
initializeApp(options, name) returns admin.app.App
Run Code Online (Sandbox Code Playgroud)
因此,实现此目标的最佳方法是在Express应用启动时制作一个文件来初始化admin应用,并导出该实例,并在需要时在应用中使用该文件
firebaseConfig.js
const admin = require('firebase-admin');
const serviceAccount = require('../serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://xxxxxxxxxxxx.firebaseio.com',
});
module.exports.admin = admin
Run Code Online (Sandbox Code Playgroud)
并在您的路线处理文件中
example.js
const { admin } = require('./firebaseConfig.js');
app.post('/auth/user/signin', function(req, res){
const ev = req.body;
const email = ev.email;
const password = ev.password;
return someFirebaseAuthQuery()
.then(() => {
// Some auth related code
...
...
...
// do not need to delete app
return res.
status(some status).
json(some data);
})
});
Run Code Online (Sandbox Code Playgroud)
或者,如果您想继续进行操作,请提供一些唯一的标识符来初始化应用程序,如下所示。
firebaseAdmin.initializeApp({
credential: {some admin creds}),
databaseURL: {some database URL}
}, "UNIQUE_IDENTIFIER");
Run Code Online (Sandbox Code Playgroud)
但是由于非常明显的原因,不鼓励以后使用
我希望这可以解决您的担忧
| 归档时间: |
|
| 查看次数: |
2586 次 |
| 最近记录: |