我想在多个文件中初始化 Firebase 应用程序,以正确组织我的方法,但是我不确定哪种方法最好。
下面是文件系统结构:
/functions
|-keys
|-methods
| |-email.js
| |-logger.js
|-node_modules
|-index.js
|-package.json
|-package-lock.json
在index.js中,我初始化2个项目,其中1个用于生产,另一个用于OTE。
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项目处理请求的方法:
let admin = req.headers.env == 'prod' ? prodServer : oteServer
现在的问题是我的./methods/logger.js
也想将日志读取/写入数据库,但是我不知道该怎么做/该怎么做。
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
导入它?
-如果再次初始化firebase项目,它将说该项目的“名称”已被使用。
-如果要从index.js
导入它,那么我必须从index.js
导出它,当我将其部署到Firebase Function时,它将变成onCall方法..?
-如果在将其部署到Firebase Function时将初始化移动到另一个文件(./method/initFirebase.js)并将其导入到index.js
,它将自动初始化firebase应用程序吗?
请告知。谢谢。
答案 0 :(得分:0)
您可以像说initFirebase.js
一样创建一个其他文件,并将初始化和导出代码放在那里。
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应用
const firebaseApp = require('../YOUR_initFirebase.js')
因此您不必担心每个文件中的环境,它对我在google cloud功能上起作用。
答案 1 :(得分:0)
在这里,您可以使用nodejs上的firebase-admin管理多个应用,以确保这些应用不会重新初始化。
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');
}
答案 2 :(得分:0)
我为ts解决此问题的方法是:
index.ts
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
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;
...