Нужно ли включать admin.initializeApp ();во всех моих файлах облачных функций firebase (Typescript)? - PullRequest
0 голосов
/ 10 октября 2018

Вопрос: Если я хотел бы использовать службы 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 используетthe 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);

1 Ответ

0 голосов
/ 10 октября 2018

При первом запуске:

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 без инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...