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

如何复用Next-auth的initFirestore对象查询Firestore数据?

无法复用NextAuth Firebase适配器的Firestore对象查询数据的解决方案

问题原因

你当前导出的firestore对象是Firebase Admin SDK的实例,而页面中调用的collection、getDocs属于客户端Firebase JS SDK的API——这两个SDK的类型系统不兼容,因此会抛出Expected first argument to collection() to be a CollectionReference...的错误。

解决方案

根据你的代码运行环境(服务端/客户端),选择对应的处理方式:

1. 服务端环境(服务器组件、API路由):复用Admin SDK实例

如果是在服务器组件或API路由中查询数据,可以直接复用现有firestore对象,但要改用Firebase Admin SDK的API语法:

import { firestore } from "@lib/firestore";

// 使用Admin SDK的API调用方式
const citiesCol = firestore.collection("cities");
const citiesSnapshot = await citiesCol.get();
const citiesList = citiesSnapshot.docs.map((doc) => doc.data());

2. 客户端环境:单独初始化客户端Firebase SDK

Admin SDK包含私钥,不能在浏览器环境运行,因此客户端组件必须单独初始化客户端版本的Firebase SDK:

  • 新建客户端Firestore配置文件/app/(lib)/clientFirestore.js:
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

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,
};

const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);
  • 在客户端组件中使用该实例:
"use client"; // 必须标记为客户端组件
import { db } from "@lib/clientFirestore";
import { collection, getDocs } from "firebase/firestore";

async function fetchCities() {
  const citiesCol = collection(db, "cities");
  const citiesSnapshot = await getDocs(citiesCol);
  return citiesSnapshot.docs.map((doc) => doc.data());
}

关键注意点

  • 服务端用Admin SDK:无用户身份限制(需确保Firestore安全规则允许Admin访问),适合敏感数据操作
  • 客户端用JS SDK:遵循Firestore安全规则,需结合用户认证控制数据访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:27:40