如何配置normalizr实现API嵌套数据的用户实体独立存储
normalizr 嵌套API数据规范化的正确实现方式
当前schema配置的问题
- 实体名和目标结构不匹配:代码里定义的实体名是
userSchema、users,规范化后的entities节点会对应这两个名称,无法生成预期的entities.user结构 - 嵌套类型判断错误:代码中给
user字段套了new schema.Array(userSchema),但实际接口返回的该字段是单个用户对象,不是用户数组,会直接导致映射异常 - 冗余实体定义:代码把带
date、details的外层条目整体建成了users实体,会多生成一个非预期的实体存储节点,不符合“仅拆分用户实体独立存储”的需求
正确的Schema配置
按照“将所有嵌套用户实体拆分、统一存在entities.user节点下”的需求,调整后的代码如下:
import { normalize, schema } from 'normalizr'; // 定义用户实体:实体名直接设为user,主键取用户对象自身的_id字段,对齐目标结构 const userEntity = new schema.Entity('user', {}, { idAttribute: '_id' }); // 定义接口返回数组的单条结构:声明每条数据里的user字段关联上面的用户实体 const apiItemSchema = { user: userEntity }; // 对完整接口返回的数组执行规范化 const normalizedResult = normalize(interfaceResponseData, new schema.Array(apiItemSchema));
规范化后的输出结构
处理完成后的核心结构符合预期:
{ // 扁平化存储的所有用户实体 entities: { user: { // 示例中写的a、b是多用户场景的键位占位,实际会自动使用每个用户自身的_id作为存储键 1: { email: "test@test.com", lastname: "User", name: "User", password: "123", _id: 1 } } }, // 保留原始顶层结构的引用,嵌套的用户字段替换为对应的实体id,不会重复冗余存储用户完整数据 result: [ { user: 1, date: "2021", details: [ { category: "admin", name: "superadmin", access: 1 } ], _id: 'xdre24d' } ] }
如果你不需要保留外层结构的引用,只要拿到扁平化的用户实体字典,直接读取
normalizedResult.entities.user即可,不需要额外处理外层result数组。
内容的提问来源于stack exchange,提问作者stepbystep
相关产品推荐
相关产品推荐

