【问题标题】:Accessing Firebase Admin across Express Routes跨 Express Route 访问 Firebase 管理员
【发布时间】:2018-12-29 11:10:48
【问题描述】:

我正在使用 Cloud Functions 和 Firestore。

在我的 index.js 中,我像这样初始化 Firebase:

index.js

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const usersApi = require("./api/users")
const paymentsApi = require("./api/payments")
const express = require('express');
const cors = require('cors');

admin.initializeApp(functions.config().firebase);

const db = admin.firestore()
const app = express();


const checkHeader = async(req, res, next) => {
  if(req.headers.authorization) {
    admin.auth().verifyIdToken(req.headers.authorization)
    .then(token => {
      req.uid = token.uid;
      req.email = token.email;
      req.stripeID = token.stripeID || null;
      return next();
    })
    .catch(e => {
      return next(e.errorInfo.code)
    })
  } else {
      return next('No token found');
  }
}

app.use(cors({origin: true}));
app.use(express.urlencoded({extended: true}));
app.use(express.json());
app.use(checkHeader);

app.disable("x-powered-by");

app.use("/users", usersApi)
app.use("/payments", paymentsApi)

exports.api = functions.https.onRequest(app)

然后在我的用户路由器中,我有以下内容:

api/users/index.js

const express = require('express');
const admin = require("firebase-admin");

const userRouter = express.Router();
const functions = require("firebase-functions");

const db = admin.firestore();

userRouter.post('/addUser', (req, res) => {
    return adminT.collection('users').doc(req.uid).set({
      activeSub: false,
      name: req.body.name
    })
    .catch(err => {
      throw new functions.https.HttpsError('unknown', err.message, {success:false, error: {err}})
    })
})

userRouter.post("*", (req, res) => {
  res.status(404).send("This route does not exist");
})

module.exports = userRouter;

根据我配置代码的方式,我似乎遇到了一些错误。 上面设置中的第一个是:

错误:默认 Firebase 应用不存在。确保你打电话 在使用任何 Firebase 服务之前进行 initializeApp()。

如果我在我的用户路由中初始化它,我会被告知默认的 Firebase 实例已经被初始化。

如何初始化 Firebase 一次,然后在整个 Cloud Function App 中使用它?

【问题讨论】:

    标签: javascript firebase express firebase-authentication google-cloud-firestore


    【解决方案1】:

    所以我最终设法让它工作。

    在我的 index.js 中,我删除了

    admin.initializeApp(functions.config().firebase);
    const db = admin.firestore()
    

    我创建了一个名为 fb.js 的文件:

    const admin = require("firebase-admin");
    const functions = require("firebase-functions");
    
    module.exports = admin.initializeApp(functions.config().firebase);
    

    然后像这样编辑我的路线:

    const express = require('express');
    const userRouter = express.Router();
    const fb = require('../../fb');
    const db = fb.firestore()
    
    userRouter.post('/addUser', (req, res) => {
        return db.collection('users').doc(req.uid).set({
          activeSub: false,
          name: req.body.name
        })
        .catch(err => {
          throw new functions.https.HttpsError('unknown', err.message, {success:false, error: {err}})
        })
    })
    
    userRouter.post("*", (req, res) => {
      res.status(404).send("This route does not exist");
    })
    
    module.exports = userRouter;
    

    【讨论】: