gpt4 book ai didi

node.js - Node.js 中的 Firebase Admin SDK 全局应用初始化

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:49 25 4
gpt4 key购买 nike

我正在构建一个 Express.js 应用,使用 Firebase Admin SDK 实现 ID token 验证和 Cloud Firestore 访问等多项功能。在我的主 app.js 文件中,我将应用程序初始化为:

const admin = require('firebase-admin')

const serviceAccount = require('../config/account-credentials.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://databaseurl.firebaseio.com'
})

在另一个文件中,我所做的就是导入:

const admin = require('firebase-admin')

我可以调用 admin.auth().verifyIdToken 并验证 ID token 。但是,当我调用 app.database() 时,它提示应用程序从未初始化。再次初始化应用程序会产生一个新错误:

The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most cases you only need to call initializeApp() once. But if you do want to initialize multiple apps, pass a second argument to initializeApp() to give each app a unique name.

我是否需要创建多个具有不同名称的应用程序才能正常工作?或者我如何在整个项目中使用一个应用程序。

最佳答案

您应该只初始化您的应用程序一次,然后重新使用该引用。有多种方法可以实现此目的,但我更喜欢的方法是将 firebase.ts(用于初始化 Firebase 应用程序和服务)导入到我的 index.ts(或任何您的入口点)中。然后我传递对需要特定服务的任何其他文件的引用。我使用的是 TypeScript,因此如果您使用的是普通 JS,请根据需要进行调整。

firebase.ts

import * as admin from 'firebase-admin';

// Initialize our project application
admin.initializeApp();

// Set up database connection
const firestoreDb: FirebaseFirestore.Firestore = admin.firestore();
firestoreDb.settings({ timestampsInSnapshots: true });
export const db = firestoreDb;

我的index.ts 文件将导入它:

import { db } from './firebase';

然后,当我使用 Express 设置路线时,我会将每条路线放在另一个具有其自己功能的文件中。然后将数据库引用传递给任何需要它的人。

  app
.route('events')
.get((req: Request, res: Response) => {
get_events(db, res);
return;
});

这是一篇博客文章,我对此进行了更多解释:

https://medium.com/@jasonbyrne/how-to-structure-a-serverless-rest-api-with-firebase-functions-express-1d7b93aaa6af

如果您不喜欢依赖注入(inject)方法或者更喜欢仅延迟加载您需要的服务,您可以采用不同的方式。在该方法中,您将拥有 firebase.js 文件(或您所说的任何名称),将其导入到任何需要它的页面并调用函数来加载该服务。这里我只是做 Firestore,但是您可以创建类似的函数来引用其他服务。

刚刚输入此示例...

import * as admin from 'firebase-admin';

// Initialize our project application
admin.initializeApp();

// Database reference, not yet loaded
let db: FirebaseFirestore.Firestore | null = null;

// Get cached db reference or create it
export function getDatabaseReference() {
if (db === null) {
db = admin.firestore();
}
return db;
}

我希望这有帮助。如果您有任何疑问,请告诉我。

关于node.js - Node.js 中的 Firebase Admin SDK 全局应用初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59726667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com