使用RTK Query向Firebase POST数据时自动生成随机ID打乱结构如何解决
解决方案
问题根因
Firebase 实时数据库的 POST 请求属于追加写入的设计,默认会在你请求的路径下自动生成唯一的随机 push ID 作为父节点,将你提交的内容包裹在该节点下,这就是你数据结构被打乱的直接原因。
修复方案
你只需要根据自己的存储需求,将请求方法从 POST 换成 PUT 即可,PUT 方法会直接将你提交的内容写入指定路径,不会自动生成额外的节点。
场景1:直接将数据存储在根路径
修改你的 RTK Query 接口配置如下:
addIngredients: builder.mutation({ query: (initialIngredients) => ({ url: "/.json", method: "PUT", // 把POST改成PUT body: initialIngredients, }), invalidatesTags: ["Ingredients"], }),
场景2:存储到自定义命名的节点下
如果你不想把数据存在根路径,要放在指定节点(比如burger节点)下,调整路径即可:
addIngredients: builder.mutation({ query: (initialIngredients) => ({ url: "/burger.json", // 自定义节点路径,后缀必须带.json method: "PUT", body: initialIngredients, }), invalidatesTags: ["Ingredients"], }),
场景3:自行指定数据的键名存储
如果你需要存储多条数据,又不想用Firebase生成的随机ID,可以把你自定义的ID拼到路径里:
addIngredients: builder.mutation({ query: (initialIngredients) => ({ // 用你自己的id字段作为键名 url: `/ingredients/${initialIngredients.id}.json`, method: "PUT", body: initialIngredients, }), invalidatesTags: ["Ingredients"], }),
注意事项
PUT方法会覆盖目标路径下已有的全部数据,如果你只需要做局部字段更新,可以换成PATCH方法- 所有请求Firebase实时数据库的路径后缀必须带
.json,否则会请求失败
内容的提问来源于stack exchange,提问作者user16911633
相关产品推荐
相关产品推荐

