如何使用NextJs在getServerSideProps中从Firebase获取数据

mxg2im7a  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(181)

我试图弄清楚如何在NextJs中的GetServerSideProps内从Firebase获取数据
这是我的数据库文件

import admin from "firebase-admin";
import serviceAccount from "./serviceAccountKey.json";

if (!admin.apps.length) {
  try {
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
    });
  } catch (error) {
    console.log("Firebase admin initialization error", error.stack);
  }
}
export default admin.firestore();

然后在getServerSideProps中

export async function getServerSideProps(context) {
  const id = context.params.profileId;
  const doc = await db.collection("profile").doc(id).get();
  const profile = doc.data();
  return {
    props: { profile },
  };
}

获取以下错误

error - ./node_modules/@google-cloud/storage/build/src/bucket.js:21:0
Module not found: Can't resolve 'fs'

有没有其他方法可以不使用依赖于文件系统的节点库来调用firebase?或者有没有其他方法可以解决这个问题?

  • 谢谢-谢谢
1tuwyuhd

1tuwyuhd1#

如果你使用firebase-admin,你只能在api函数中使用。你甚至不能在客户端导入它。它需要访问fs模块,而客户端没有。如果你需要在客户端使用firebase,请使用@firebase/app npm模块。

import { initializeApp, getApps } from 'firebase/app'
import { getAnalytics } from 'firebase/analytics'
export const createFirebaseApp = () => {
  const clientCredentials = {
    apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
    authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
    databaseURL: process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL,
    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,
  }

  if (getApps().length <= 0) {
    const app = initializeApp(clientCredentials)
    // Check that `window` is in scope for the analytics module!
    if (typeof window !== 'undefined') {
      // Enable analytics. https://firebase.google.com/docs/analytics/get-started
      if ('measurementId' in clientCredentials) {
        getAnalytics()
      }
    }
    return app
  }
}

您可以有两个单独的firebase config files。一个用于客户端,如上所述,另一个使用您定义的firebase-admin

相关问题