Я пытаюсь понять, как получить данные из Firebase внутри GetServerSideProps в NextJs.
Вот мой файл БД
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 без использования библиотеки узлов, которая зависит от файловой системы? Или есть способ обойти это?
Спасибо.
Похоже, это так. Однако, согласно документации Next.js, getServerSideProps работает только на стороне сервера и никогда не запускается в браузере.
Если вы используете 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. Один для клиентской стороны, как указано выше, другой использует firebase-admin
, как вы определили.
Красивый! Это работает.
вы получаете эту ошибку, потому что где-то на стороне клиента вы используете код firebase, который принадлежит стороне сервера. На стороне клиента у вас нет модуля
fs
, поэтому код, работающий на клиенте, не работает.