开发者问题收集

Firebase Firestore db.collection 不是一个函数

2021-09-24
4285

我正在开发一个班次调度程序,我使用 Firebase 身份验证和 Firestore。我的想法是,当用户注册时,它会在集合“workers”中创建一个文档,并将文档 ID 设置为用户的电子邮件。当用户添加班次时,我想将班次信息添加到该用户文档内的子集合“shifts”中,所有班次都将存储在该子集合中。我已经阅读并看过许多指南,但我无法正确理解语法/逻辑,并且由于 Firebase 语法的变化,我将包括我使用的大多数设置。

firebase.js:

import { getAuth } from "firebase/auth";
import "firebase/firestore";
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore"
require('firebase/auth');

const firebaseConfig = {
  ...
};
const app = initializeApp(firebaseConfig);

export const db = getFirestore(app);
export const auth = getAuth(app);
export default app

SignUp.js:

import { db } from "../firebase";
import { collection, addDoc, setDoc, doc } from "firebase/firestore";
import { useAuth } from '../contexts/AuthContext';
const { signup } = useAuth();  
 
    const handleSubmit = async (event) => {
    event.preventDefault();
    setError("");
      try{
        const data = new FormData(event.currentTarget);
        await signup ( data.get('email'), data.get('password'));
        const docRef = await setDoc(doc(db, "workers", data.get('email')), {
            firstName: data.get('firstName'),
            lastName: data.get('lastName'),
            email: data.get('email'),
            numberOfShifts: 0
        });
      }
      catch(e){
          console.error("Error adding document: ", e);
          setError("Failed to create an account");
      };

注册工作正常,文档 ID 是电子邮件。当我尝试将班次添加到该文档时出现错误(此阶段未创建班次集合)

Datasheed.js: (用户输入班次的位置)

import { auth } from "../firebase"
import { db } from "../firebase";

const commitChanges = async ({ added, changed, deleted }) => {
      if (added) {
        try {
          db.collection("workers")
          .doc(auth.currentUser.email)
          .collection("shifts")
          .add(added);
        } catch (e) {
          console.error("Error adding document: ", e);
        }
      }

目前,我只是尝试添加,我得到的捕获异常是: 添加文档时出错:TypeError: firebase__WEBPACK_IMPORTED_MODULE_5 _.db.collection 不是函数。 据我所知,问题是我使用 firebase 模块化,它不再有 db.collection,并且它使用集合引用。我是否也需要子集合的集合引用?为了实现这一点,我需要做哪些更改?

1个回答

您在 signup.js 中使用了模块化 SDK 和模块化语法。您应该在其他地方使用相同的语法。尝试像这样重构:

const commitChanges = async ({ added, changed, deleted }) => {
  if (added) {
    try {
      await addDoc(collection(db, "workers", auth.currentUser.email, "shifts"), added)
    } catch (e) {
      console.error("Error adding document: ", e);
    }
  }
}

您可以在 文档 中了解有关新语法的更多信息。

Dharmaraj
2021-09-24