修复由于多次初始化Firebase而导致的Firebase错误

Utk*_*pta 3 node.js firebase

我正在使用将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的错误。任何想法如何解决这个问题?

Rid*_*ara 5

您不应在每次收到请求时都创建一个实例。如果您正在运行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)

但是由于非常明显的原因,不鼓励以后使用

我希望这可以解决您的担忧