我正在尝试在我的 NextJs 项目中使用 firebase。
我创造了这个
initFirebase.tsx
对于服务器
import * as Sentry from '@sentry/nextjs';
import * as admin from 'firebase-admin';
const initFirebaseAdmin = async (config: admin.AppOptions) => {
try {
if (!admin.apps.length) {
admin.initializeApp({ ...config });
}
} catch (e) {
Sentry.captureException(e);
}
};
export const init = () => {
initFirebaseAdmin({
credential: admin.credential.cert({
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
clientEmail: process.env.NEXT_FIREBASE_ADMIN_PRIVATE_CLIENT_EMAIL,
privateKey: process.env.NEXT_FIREBASE_ADMIN_PRIVATE_KEY.replace(
/\\n/g,
'\n'
),
}),
});
};
在我的 API 中我正在做
import { addDoc, collection, getFirestore } from 'firebase/firestore';
import { init } from '../initFirebase';
export async function createPlace(req: Request) {
init();
try {
const payload: Place = await req.json();
const response = await addDoc(collection(getFirestore(), 'test'), payload);
return Response.json(response, {
status: 201,
});
} catch (error) {
return Response.json({ error: 'internal_error' }, { status: 500 });
}
}
现在,在大多数教程中,这已经足够了,但不知何故,我明白了
FirebaseError:Firebase:未创建 Firebase 应用程序“[DEFAULT]” - 首先调用initializeApp()(应用程序/无应用程序)。
admin.initializeApp({ ...config });
被正确调用,没有错误。
我需要初始化 firebase-admin 和 firebase 吗?因为它看起来并不需要它
您犯的错误是混合使用用于后端服务器的 Firebase Admin SDK 和用于 Web 前端的 Firebase 客户端 SDK。它们是完全不同的东西,根本不能互换。每个版本的最新版本甚至不再有类似的 API。
如果您使用 firebase-admin 编写后端代码,则需要完全删除 firebase/firestore(以及用于 Web 客户端的其他 firebase/*)依赖项 - 它们不会有用。然后,您可以根据您在API文档中看到的内容,单独使用firebase-admin来读写Firestore。 firebase-admin 只是 @google-cloud/firestore Nodejs 包之上的一个薄包装器,并且具有相同的 API。请注意,您不会使用在 Web 客户端 SDK 中看到的
doc()
和 addDoc()
等功能。
另请参阅: