You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:48:18