使用NextAuth Firebase适配器报错Cannot access 'app' before initialization
错误原因
- 初始化顺序错误:你的Firebase客户端配置文件中,调用
getAnalytics(app)时app还未执行初始化赋值,app的初始化代码在调用语句之后,触发了变量未初始化的引用错误。 - SDK版本混用:代码同时使用了Firebase v8的命名空间导入语法(
import firebase from "firebase/app")和v9的模块化API语法(import { initializeApp } from "firebase/app"),两种语法不兼容,也会引发后续调用异常。
解决方法
1. 修正Firebase客户端配置代码
统一Firebase SDK写法,调整初始化顺序,避免变量未初始化调用,修正后代码示例如下:
import firebase from "firebase/app"; import "firebase/auth"; import "firebase/firestore"; import "firebase/analytics"; const firebaseConfig = { apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY, authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID, storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET, messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID, measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASURMENT_ID, }; // 避免重复初始化 if (!firebase.apps.length) { firebase.initializeApp(firebaseConfig); } const app = firebase.app(); const analytics = firebase.analytics(app); const firestore = firebase.firestore(); export { firestore }; export default firebase;
2. 简化NextAuth配置代码
直接复用Firebase客户端导出的firestore实例,避免重复初始化逻辑:
import NextAuth from "next-auth"; import { FirebaseAdapter } from "@next-auth/firebase-adapter"; import GoogleProvider from "next-auth/providers/google"; import { firestore } from "../../../firebase/FirebaseClient"; export default NextAuth({ providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], adapter: FirebaseAdapter(firestore), });
额外注意
如果你的项目使用Firebase v9模块化版本,需同步升级@next-auth/firebase-adapter到支持v9的对应版本,避免API不兼容问题。
内容的提问来源于stack exchange,提问作者KeoooDev
相关产品推荐
相关产品推荐

