Anonymous
Веб-приложение – невозможно сохранить данные в базе данных Firebase Firestore
Сообщение
Anonymous » 11 ноя 2025, 06:16
Я создал файл Signup.ts и файл auth-web.ts.
Код в порядке, я могу зарегистрироваться и создать учетную запись. Электронная почта успешно аутентифицирована в Firebase, однако коллекция даже не создана в Firebase.
config.ts
Код: Выделить всё
// apps/web/firebase/config.ts
import { initializeApp, getApps } from "firebase/app";
import {
getAuth,
GoogleAuthProvider,
browserLocalPersistence,
setPersistence,
} from "firebase/auth";
import { getFirestore } from "firebase/firestore";
import { getStorage } from "firebase/storage";
const firebaseConfig = {
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_FIREBASE_APP_ID,
};
const app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0];
export const auth = getAuth(app);
export const db = getFirestore(app);
export const storage = getStorage(app);
export const googleProvider = new GoogleAuthProvider();
setPersistence(auth, browserLocalPersistence).catch((err) =>
console.error("Persistence error:", err)
);
export default app;
auth-web.ts:
Код: Выделить всё
import { auth, db } from "./config";
import {
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
signInWithPopup,
GoogleAuthProvider,
onAuthStateChanged,
signOut,
updateProfile,
User,
} from "firebase/auth";
import { doc, setDoc, serverTimestamp } from "firebase/firestore";
import { useState, useEffect } from "react";
const googleProvider = new GoogleAuthProvider();
const saveUserToFirestore = async (user: User) => {
if (!db) throw new Error("Firestore not initialized");
console.log("Saving user to Firestore:", user.uid);
const userDoc = doc(db, "users", user.uid);
await setDoc(
userDoc,
{
uid: user.uid,
email: user.email,
displayName: user.displayName || "",
createdAt: serverTimestamp(),
},
{ merge: true }
);
};
export const signUpWeb = async (email: string, password: string, name?: string) => {
if (!auth) throw new Error("Firebase auth not initialized");
const result = await createUserWithEmailAndPassword(auth, email, password);
if (name) {
await updateProfile(result.user, { displayName: name });
}
await saveUserToFirestore(result.user);
return result.user;
};
export const loginWeb = async (email: string, password: string) => {
if (!auth) throw new Error("Firebase auth not initialized");
const result = await signInWithEmailAndPassword(auth, email, password);
await saveUserToFirestore(result.user);
return result.user;
};
export const loginGoogleWeb = async () => {
if (!auth) throw new Error("Firebase auth not initialized");
const result = await signInWithPopup(auth, googleProvider);
await saveUserToFirestore(result.user);
return result.user;
};
export const logoutWeb = async () => {
if (!auth) throw new Error("Firebase auth not initialized");
return signOut(auth);
};
export const useWebAuthState = () => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
if (!auth) return;
const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
setUser(firebaseUser);
setLoading(false);
});
return unsubscribe;
}, []);
return { user, loading };
};
signup.ts:
Код: Выделить всё
import { useState } from "react";
import { signUpWeb as signupEmailWeb, loginGoogleWeb } from "../../../firebase/auth-web";
import { useRouter } from "next/router";
export default function SignupPage() {
const router = useRouter();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const handleSignup = async () => {
setError("");
try {
await signupEmailWeb(email, password);
router.push("/");
} catch (err: any) {
setError(err.message);
}
};
const handleGoogleSignup = async () => {
setError("");
try {
await loginGoogleWeb();
router.push("/");
} catch (err: any) {
setError("Google Sign-In failed");
}
};
return (
Create Account
Continue with Google
── or ──
setEmail(e.target.value)}
style={{
display: "block",
width: "100%",
padding: "10px",
marginTop: "10px",
}}
/>
setPassword(e.target.value)}
style={{
display: "block",
width: "100%",
padding: "10px",
marginTop: "10px",
}}
/>
{error &&
{error}
}
Sign Up
Already have an account?{" "}
router.push("/login")}
style={{ color: "#007bff", cursor: "pointer" }}
>
Login
);
}
это файлы, в которых у меня есть код, я все перепробовал, я даже изменил правило хранения Firebase на общедоступное, но ничего не происходит.
в веб-консоли у меня следующая ошибка:
webchannel_blob_es2018.js:49 GET
https://firestore.googleapis.com/google ... te/channel .... 400 (неверный запрос)
[2025-11-11T02:12:28.160Z] @firebase/firestore: Firestore (12.5.0): поток записи RPC WebChannelConnection RPC 0x49d736ed произошла ошибка транспорта. Имя: неопределенное Сообщение: неопределенное
Подробнее здесь:
https://stackoverflow.com/questions/798 ... e-database
1762830999
Anonymous
Я создал файл Signup.ts и файл auth-web.ts. Код в порядке, я могу зарегистрироваться и создать учетную запись. Электронная почта успешно аутентифицирована в Firebase, однако коллекция даже не создана в Firebase. config.ts [code]// apps/web/firebase/config.ts import { initializeApp, getApps } from "firebase/app"; import { getAuth, GoogleAuthProvider, browserLocalPersistence, setPersistence, } from "firebase/auth"; import { getFirestore } from "firebase/firestore"; import { getStorage } from "firebase/storage"; const firebaseConfig = { apiKey: process.env.REACT_APP_FIREBASE_API_KEY, authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, appId: process.env.REACT_APP_FIREBASE_APP_ID, }; const app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]; export const auth = getAuth(app); export const db = getFirestore(app); export const storage = getStorage(app); export const googleProvider = new GoogleAuthProvider(); setPersistence(auth, browserLocalPersistence).catch((err) => console.error("Persistence error:", err) ); export default app; [/code] auth-web.ts: [code]import { auth, db } from "./config"; import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, onAuthStateChanged, signOut, updateProfile, User, } from "firebase/auth"; import { doc, setDoc, serverTimestamp } from "firebase/firestore"; import { useState, useEffect } from "react"; const googleProvider = new GoogleAuthProvider(); const saveUserToFirestore = async (user: User) => { if (!db) throw new Error("Firestore not initialized"); console.log("Saving user to Firestore:", user.uid); const userDoc = doc(db, "users", user.uid); await setDoc( userDoc, { uid: user.uid, email: user.email, displayName: user.displayName || "", createdAt: serverTimestamp(), }, { merge: true } ); }; export const signUpWeb = async (email: string, password: string, name?: string) => { if (!auth) throw new Error("Firebase auth not initialized"); const result = await createUserWithEmailAndPassword(auth, email, password); if (name) { await updateProfile(result.user, { displayName: name }); } await saveUserToFirestore(result.user); return result.user; }; export const loginWeb = async (email: string, password: string) => { if (!auth) throw new Error("Firebase auth not initialized"); const result = await signInWithEmailAndPassword(auth, email, password); await saveUserToFirestore(result.user); return result.user; }; export const loginGoogleWeb = async () => { if (!auth) throw new Error("Firebase auth not initialized"); const result = await signInWithPopup(auth, googleProvider); await saveUserToFirestore(result.user); return result.user; }; export const logoutWeb = async () => { if (!auth) throw new Error("Firebase auth not initialized"); return signOut(auth); }; export const useWebAuthState = () => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!auth) return; const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => { setUser(firebaseUser); setLoading(false); }); return unsubscribe; }, []); return { user, loading }; }; [/code] signup.ts: [code]import { useState } from "react"; import { signUpWeb as signupEmailWeb, loginGoogleWeb } from "../../../firebase/auth-web"; import { useRouter } from "next/router"; export default function SignupPage() { const router = useRouter(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const handleSignup = async () => { setError(""); try { await signupEmailWeb(email, password); router.push("/"); } catch (err: any) { setError(err.message); } }; const handleGoogleSignup = async () => { setError(""); try { await loginGoogleWeb(); router.push("/"); } catch (err: any) { setError("Google Sign-In failed"); } }; return ( Create Account Continue with Google ── or ── setEmail(e.target.value)} style={{ display: "block", width: "100%", padding: "10px", marginTop: "10px", }} /> setPassword(e.target.value)} style={{ display: "block", width: "100%", padding: "10px", marginTop: "10px", }} /> {error && {error} } Sign Up Already have an account?{" "} router.push("/login")} style={{ color: "#007bff", cursor: "pointer" }} > Login ); } [/code] это файлы, в которых у меня есть код, я все перепробовал, я даже изменил правило хранения Firebase на общедоступное, но ничего не происходит. в веб-консоли у меня следующая ошибка: webchannel_blob_es2018.js:49 GET https://firestore.googleapis.com/google.firestore.v1.Firestore/Write/channel.... 400 (неверный запрос) [2025-11-11T02:12:28.160Z] @firebase/firestore: Firestore (12.5.0): поток записи RPC WebChannelConnection RPC 0x49d736ed произошла ошибка транспорта. Имя: неопределенное Сообщение: неопределенное Подробнее здесь: [url]https://stackoverflow.com/questions/79816186/web-app-unable-to-store-data-in-firebase-firestore-database[/url]