The Firebase Admin package is a way to use Firebase on NodeJS, thus allowing us to write backend code with the various Firebase packages such as Auth, Firestore, Storage, and so on.
To use Firebase with a Next.js API function, we have to initialize the Firebase Admin. Let's see how it's done:
Firebase configuration
First, we have to store and retrieve the Firebase configuration for our project.
To do so, we can use the Next.js environment variables by creating a .env
file in the root folder, and making sure to fill the values below correctly:
NEXT_PUBLIC_FIREBASE_PROJECT_ID=NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=FIREBASE_PRIVATE_KEY=FIREBASE_CLIENT_EMAIL=
Once it's done, we can create a function that accepts the following interface and returns the Firebase admin app:
interface FirebaseAdminAppParams { projectId: string; clientEmail: string; storageBucket: string; privateKey: string;}
The snippet below is everything you need to create an admin app using Firebase:
import admin from 'firebase-admin';function formatFirebasePrivateKey(key: string) { return key.replace(/\\n/g, '\n');}export function createFirebaseAdminApp(params: FirebaseAdminAppParams) { const privateKey = formatFirebasePrivateKey(params.privateKey); // if already created, return the same instance if (admin.apps.length > 0) { return admin.app(); } // create certificate const cert = admin.credential.cert({ projectId: params.projectId, clientEmail: params.clientEmail, privateKey, }); // initialize admin app return admin.initializeApp({ credential: cert, projectId: params.projectId, storageBucket: params.storageBucket, });}
Let's assume you created a Next.js API function and want to create a Firebase admin app to be able to use Firestore, you can do the following:
import { createFirebaseAdminApp } from './initialize-firebase-admin-app';import { getFirestore } from 'firebase-admin/firestore';async function initializeAdmin() { const params = { projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID, clientEmail: process.env.FIREBASE_CLIENT_EMAIL, storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET, privateKey: process.env.FIREBASE_PRIVATE_KEY }; return createFirebaseAdminApp(params);}export default function getTeams( req: NextApiRequest, res: NextApiResponse,) { // initialize admin await initializeAdmin(); // now we can use the Firebase packages! const firestore = getFirestore(); const { docs, size } = await firestore.collection('teams').get(); const teams = docs.map(doc => doc.data()) return res.send(teams);}