首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用nodejs在多个文件中初始化firebase应用程序

用nodejs在多个文件中初始化firebase应用程序
EN

Stack Overflow用户
提问于 2018-10-22 04:05:56
回答 3查看 2.7K关注 0票数 5

我希望在多个文件中初始化Firebase应用程序,以正确地组织我的方法,但我不确定哪种方法是最好的方法。

以下是文件系统结构:

代码语言:javascript
运行
复制
/functions
 |-keys
 |-methods
 |  |-email.js
 |  |-logger.js
 |-node_modules
 |-index.js
 |-package.json
 |-package-lock.json

在我的index.js中,我初始化了两个项目,其中一个用于生产,另一个用于OTE。

代码语言:javascript
运行
复制
const functions = require('firebase-functions');
var firebaseAdmin = require('firebase-admin');

var productionServiceAccount = require('./keys/production-key.json');
var oteServiceAccount = require("./keys/ote-key.json");

var prodServer = firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(productionServiceAccount),
    databaseURL: 'https://production-panel.firebaseio.com'
}, "prod");
var oteServer = firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(oteServiceAccount),
    databaseURL: "https://ote-panel.firebaseio.com"
}, "ote");

console.log("prodServer: ", prodServer.name, "oteServer: ", oteServer.name)

var mailer = require('./methods/email.js') //import code from method folder
var logger = require('./methods/logger.js') //import code from method folder

下面是我如何处理请求,无论是使用prod还是OTE项目:

代码语言:javascript
运行
复制
let admin = req.headers.env == 'prod' ? prodServer : oteServer

现在的问题是,我的./methods/logger.js也想将日志读写到DB中,但是我不知道该如何/做什么。

代码语言:javascript
运行
复制
Below is the `logger.js` code:
var exports = {}

exports.log = function(item, ref, env) {
    let admin = env == 'prod' ? prodServer : oteServer //<--problem here

    return admin.database().ref(ref).push(item)
}

module.exports = exports

我应该再次初始化firebase项目还是从index.js导入它?

-If再次初始化firebase项目--它会说项目“名称”已经被使用。

-If从index.js导入它,然后我必须从index.js导出它,当我将它部署到Firebase函数时,它将变成一个onCall方法。

-If我将初始化移动到另一个文件(./method/initFirebase.js),并将其导入到index.js,当我将它部署到Firebase函数时,它会自动初始化防火墙应用程序吗?

请给我建议。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-10-22 06:26:56

您可以像您所说的initFirebase.js创建一个额外的文件,并将初始化和导出代码放在那里。

代码语言:javascript
运行
复制
const prodServer = firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(productionServiceAccount),
    databaseURL: 'https://production-panel.firebaseio.com',
}, 'prod');
const oteServer = firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(oteServiceAccount),
    databaseURL: 'https://ote-panel.firebaseio.com',
}, 'ote');
module.exports = {
    firebaseApp: env === 'prod' ? prodServer : oteServer,
};

以及从所有其他文件导入的firebase应用程序。

代码语言:javascript
运行
复制
const firebaseApp = require('../YOUR_initFirebase.js')

因此,您不需要担心每个文件中的环境,它在google云功能上为我工作。

票数 1
EN

Stack Overflow用户

发布于 2020-09-01 06:14:02

下面是如何使用nodejs上的firebase管理来管理多个应用程序,以确保应用程序不会被重新初始化。

代码语言:javascript
运行
复制
const admin = require('firebase-admin');
const service1 = require('./app1-service.json');
const service2 = require('./app2-service.json');

const apps = {
  app1: null,
  app2: null,
};

void init() {
  // check and init app1
  const initialisedApps = admin.apps.map((item) => item.name);
  if (!initialisedApps.includes('app1')) {
    apps.app1 = admin.initializeApp({
      credential: admin.credential.cert(service1),
    }, 'app1');
  } else apps.app1 = admin.app('app1');
  
  // check and init app2
  if (!initialisedApps.includes('app2')) {
    apps.app2 = admin.initializeApp({
      credential: admin.credential.cert(service2),
    }, 'app2');
  } else apps.app2 = admin.app('app2');
}
票数 0
EN

Stack Overflow用户

发布于 2020-10-12 15:04:21

我解决这个问题的方法是:

index.ts

代码语言:javascript
运行
复制
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);

exports.auth = require('./methods/email.ts');

...

email.ts

代码语言:javascript
运行
复制
import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';

// Get emails
exports.getEMail = functions.https.onCall(async (data, context) => {

  const uid = context?.auth?.uid ? context.auth.uid : '';
  const email = await admin.firestore().collection('emails').doc(uid).get();

  return email;
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52922274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档