我是否需要在所有 Firebase Cloud 函数文件(Typescript)中包含 admin.initialize



问:如果我想在单独的函数文件中使用 Firebase 服务,是否必须在每个文件的顶部包含admin.initializeApp();

目前这样做的最佳实践是什么?

我有一个包含 3 个文件的源文件夹

  1. auth.ts - admin.initializeApp 位于此文件的顶部
  2. http.ts - 如果我想使用 Firebase 服务,我应该在此处添加它吗?
  3. 索引.ts

我的索引.ts文件是:

export { basicHTTP, advanceHTTP, api } from "./http";
export { createUserRecord } from "./auth";

我的 auth.ts 文件使用 admin.firestore((:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();
const db = admin.firestore();
export const createUserRecord = functions.auth
.user()
.onCreate((user, context) => {
const userRef = db.doc(`users/${user.uid}`);
return userRef.set({
name: user.displayName,
createdAt: context.timestamp,
nickname: "bubba"
});
});

我的 http.ts 文件包含以下内容,如果我想在此函数中使用 Firebase 服务,该怎么办?

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
// Express
import * as express from "express";
import * as cors from "cors";
// Most basic http function
export const basicHTTP = functions.https.onRequest((request, response) => {
response.send("Hello from firebase");
});
export const advanceHTTP = functions.https.onRequest((request, response) => {
const name = request.query.name;
if (!name) {
response.status(400).send("You must supply a name");
}
response.send(`Hi there ${name}`);
});
// Custom middleware
const auth = (request, response, next) => {
if (!request.header.authorization) {
response.status(400).send("Unauthorized. Access denied");
}
next();
};
// Multi Route ExpressJS HTTP Function
const app = express();
app.use(cors({ origin: true }));
app.use(auth);
app.get("/cat", (request, response) => {
response.send("Cat");
});
app.get("/dog", (request, response) => {
response.send("dog");
});
export const api = functions.https.onRequest(app);

第一次运行以下命令:

import * as admin from "firebase-admin";
admin.initializeApp();

从其他文件中的后续导入返回的admin已经初始化。 这是因为从模块导入的所有内容都会生成完全相同的对象。

如果你想在多个地方使用 firebase-admin,你可能只需在函数入口点 (index.ts( 导入并初始化一次,然后在所有其他地方假设它已经被初始化:

import * as admin from "firebase-admin";
admin.initializeApp();
export { basicHTTP, advanceHTTP, api } from "./http";
export { createUserRecord } from "./auth";

现在,您只需在其他模块中导入 firebase-admin 并使用 admin,而无需对其进行初始化。

最新更新