RTK Query通过transformResponse正确映射响应属性的方法
问题说明
对接Scheduler调度器组件时,需要在RTK Query数据入库前完成字段映射,避免组件内转换导致的加载失败问题。使用transformResponse配置做字段转换时,接口请求成功但返回值为空对象/仅含单个空对象的数组,移除该配置后接口返回原始数据正常,无法适配组件字段要求。
原有问题代码:
getUserScheduleVisits: builder.query({ query: userId => `/visitapi/visits/users/${userId}`, providesTags: ['Visit', 'User'], transformResponse: (response) => { return { data: [{ id: response._id, startDate: response.visitStart, endDate: response.visitEnd, title: response?.client?.fullName }] } }, }),
故障原因
代码存在两个核心问题:
- 多余嵌套结构:RTK Query会把
transformResponse的返回值直接作为查询hook输出的data字段,不需要额外包裹data属性,额外嵌套会导致输出结构和组件预期不符 - 响应结构处理错误:从返回空对象的现象判断,该接口实际返回的是拜访记录数组,而非单条记录对象。原有代码直接从响应顶层读取单条记录的
_id、visitStart等属性,所有字段都会读取为undefined,最终生成属性全为空的无效对象
修复方案
直接遍历接口返回的数组,逐条完成字段映射后返回即可,同时增加空值兜底避免接口异常时的报错:
getUserScheduleVisits: builder.query({ query: userId => `/visitapi/visits/users/${userId}`, providesTags: ['Visit', 'User'], transformResponse: (response) => { // 非数组场景兜底返回空数组 if (!Array.isArray(response)) return []; // 逐条做字段映射,直接返回映射后的数组,无需额外包装 return response.map(visitItem => ({ id: visitItem._id, startDate: visitItem.visitStart, endDate: visitItem.visitEnd, title: visitItem?.client?.fullName })) }, }),
如果后端接口返回的是带外层包装的结构(比如
{ code: 200, data: [] }格式),只需要先取出实际的数组层再做遍历即可,例如const rawList = response.data ?? [],后续映射逻辑不变。
内容的提问来源于stack exchange,提问作者Jowz
相关产品推荐
相关产品推荐

