无法使用RECT中的RTK-Query在Firestore中删除或添加数据

发布于 2025-02-01 20:19:37 字数 2672 浏览 3 评论 0原文

我正在尝试实现删除并添加使用Firestore的RTK-Query在React中添加功能。我使用RTK查询在React中执行Firestore操作可能很奇怪。因此,我已经编写了服务API文件来删除并与Firestore添加操作。因此,每当我尝试使用RTK查询中删除或在Firestore中添加数据时,我会在控制台中遇到一些奇怪的错误。但是,当我刷新应用程序时,我在执行添加/删除操作后会在应用程序上看到更新的数据。由于某种原因,最初并不能为​​我提供正确的结果,因此由于以下错误,但是在Page Refresh之后,我将从React应用中的Firestore获得更新的值。

这是服务API

import { createApi, fakeBaseQuery } from "@reduxjs/toolkit/query/react";
import {
  addDoc,
  collection,
  deleteDoc,
  doc,
  getDocs,
  onSnapshot,
  serverTimestamp,
} from "firebase/firestore";
import { db } from "../firebase";

export const contactsApi = createApi({
  reducerPath: "api",
  baseQuery: fakeBaseQuery(),
  tagTypes: ["Contact"],
  endpoints: (builder) => ({
    contacts: builder.query({
      async queryFn() {
        try {
          const userRef = collection(db, "users");
          const querySnapshot = await getDocs(userRef);
          let usersData = [];
          querySnapshot?.forEach((doc) => {
            usersData.push({
              id: doc.id,
              ...doc.data(),
            });
          });
          return { data: usersData };
        } catch (err) {
          console.log("err", err);
          return { error: err };
        }
      },
      providesTags: ["Contact"],
    }),
    addContact: builder.mutation({ 
      async queryFn(contact) {
        try {
          await addDoc(collection(db, "users"), {
            ...contact,
            timestamp: serverTimestamp(),
          });
        } catch (err) {
          return { error: err ? err : null };
        }
      },
      invalidatesTags: ["Contact"],
    }),
    deleteContact: builder.mutation({
      async queryFn(id) {
        try {
          await deleteDoc(doc(db, "users", id));
        } catch (err) {
          if (err) {
            return { error: err };
          }
        }
      },
      invalidatesTags: ["Contact"],
    }),
  }),
});

export const {
  useContactsQuery,
  useAddContactMutation,
  useDeleteContactMutation,
} = contactsApi;

Store.js文件的代码

import { configureStore } from "@reduxjs/toolkit";
import { contactsApi } from "./services/contactsApi";
import { setupListeners } from "@reduxjs/toolkit/query";

export const store = configureStore({
  reducer: {
    [contactsApi.reducerPath]: contactsApi.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: false,
    }).concat(contactsApi.middleware),
});

setupListeners(store.dispatch);

I am trying to achieve delete and add functionality in react using RTK-Query with firestore. It sound might be weird that I am using RTK Query to perform firestore operation in React. So, I have written service API file to delete and add operation with firestore. So, whenever I try to delete or add data in firestore with RTK Query, so I am getting some weird error in my console. However, when I refresh the application then I am seeing the updated data on my app after performing the add/delete operation. For some reason, initially it's not providing me correct result due to below error but after page refresh I am getting the updated value from firestore in my react app.

enter image description here

Here is code for service API

import { createApi, fakeBaseQuery } from "@reduxjs/toolkit/query/react";
import {
  addDoc,
  collection,
  deleteDoc,
  doc,
  getDocs,
  onSnapshot,
  serverTimestamp,
} from "firebase/firestore";
import { db } from "../firebase";

export const contactsApi = createApi({
  reducerPath: "api",
  baseQuery: fakeBaseQuery(),
  tagTypes: ["Contact"],
  endpoints: (builder) => ({
    contacts: builder.query({
      async queryFn() {
        try {
          const userRef = collection(db, "users");
          const querySnapshot = await getDocs(userRef);
          let usersData = [];
          querySnapshot?.forEach((doc) => {
            usersData.push({
              id: doc.id,
              ...doc.data(),
            });
          });
          return { data: usersData };
        } catch (err) {
          console.log("err", err);
          return { error: err };
        }
      },
      providesTags: ["Contact"],
    }),
    addContact: builder.mutation({ 
      async queryFn(contact) {
        try {
          await addDoc(collection(db, "users"), {
            ...contact,
            timestamp: serverTimestamp(),
          });
        } catch (err) {
          return { error: err ? err : null };
        }
      },
      invalidatesTags: ["Contact"],
    }),
    deleteContact: builder.mutation({
      async queryFn(id) {
        try {
          await deleteDoc(doc(db, "users", id));
        } catch (err) {
          if (err) {
            return { error: err };
          }
        }
      },
      invalidatesTags: ["Contact"],
    }),
  }),
});

export const {
  useContactsQuery,
  useAddContactMutation,
  useDeleteContactMutation,
} = contactsApi;

store.js file

import { configureStore } from "@reduxjs/toolkit";
import { contactsApi } from "./services/contactsApi";
import { setupListeners } from "@reduxjs/toolkit/query";

export const store = configureStore({
  reducer: {
    [contactsApi.reducerPath]: contactsApi.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: false,
    }).concat(contactsApi.middleware),
});

setupListeners(store.dispatch);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

So尛奶瓶 2025-02-08 20:19:37

queryfn必须始终返回具有data属性或error属性的对象 - 在您的情况下仅在错误情况下这样做。

尝试添加返回{data:'ok'}如果您没有更好的主意。

A queryFn has to always return an object with either a data property or an error property - in your case you only do that in the error case.

Try adding a return { data: 'ok' } if you don't have any better idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文