【问题标题】:Do i need to include admin.initializeApp(); in all my firebase cloud functions file (Typescript)?我需要包括 admin.initializeApp();在我所有的 Firebase 云函数文件(Typescript)中?
【发布时间】:2019-03-15 11:53:41
【问题描述】:

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

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

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

  1. auth.ts - admin.initializeApp 位于此文件的顶部
  2. http.ts - 如果我想使用 firebase 服务,是否在此处添加?
  3. index.ts

我的 index.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);

【问题讨论】:

  • 现在我只在 index.js 文件中调用admin.initializeApp(),我没有遇到任何问题。我仍然会在使用它的任何文件中导入管理 SDK。另外,我所有的路由都是在 index.js 文件中完成的。

标签: typescript firebase google-cloud-functions


【解决方案1】:

第一次运行时:

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 而无需初始化它。

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多