You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextAuth与Firebase集成报错:Cannot use import statement outside a module

解决NextAuth.js + Firebase Discord登录认证错误

核心问题分析

你的代码存在几处关键问题,导致认证流程失败:

  1. Firebase初始化时调用getApps.length错误,需调用getApps()获取应用列表后再判断长度
  2. 混合使用Firebase Compat SDK与模块化SDK,易引发冲突
  3. NextAuth的Firestore适配器传入配置对象而非已初始化的Firestore实例,可能导致重复初始化错误

修改后的代码

1. 修正firebase.js

import { initializeApp, getApps, getApp } from 'firebase/app';
import { getFirestore } from 'firebase/firestore';
import { getStorage } from 'firebase/storage';

export 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_MEASUREMENT_ID
};

// 修复getApps调用方式,避免重复初始化应用
export const app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig);
export const firestore = getFirestore(app);
export const storage = getStorage(app);

2. 修正[...nextauth].js

import NextAuth from "next-auth";
import DiscordProvider from 'next-auth/providers/discord';
import { FirestoreAdapter } from "@next-auth/firebase-adapter";
import { firestore } from "../../../lib/firebase";

export default NextAuth({
    providers: [
        DiscordProvider({
            clientId: process.env.DISCORD_ID,
            clientSecret: process.env.DISCORD_SECRET
        }),
    ],
    // 传入已初始化的Firestore实例,避免重复初始化
    adapter: FirestoreAdapter(firestore),
    // 可选:使用JWT会话策略,减少Firestore依赖
    session: {
        strategy: "jwt"
    }
})

额外检查项

  • 确认所有环境变量(NEXT_PUBLIC_FIREBASE_*、DISCORD_ID、DISCORD_SECRET)在.env.local文件中配置正确,无拼写错误
  • 确保Firebase项目已启用Firestore数据库,开发环境可暂时设置数据库规则为:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if true;
        }
      }
    }
    
    生产环境需调整为安全规则
  • 检查next-auth和@next-auth/firebase-adapter版本兼容性,建议使用最新稳定版
  • 移除package.json中的"type": "module",Next.js默认支持ES模块,无需额外配置

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:15:40