NextJs 和 Firestore 初始化

问题描述 投票:0回答:1

我正在尝试在我的 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 吗?因为它看起来并不需要它

javascript firebase google-cloud-firestore next.js firebase-admin
1个回答
0
投票

您犯的错误是混合使用用于后端服务器的 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()
等功能。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.