You need to enable JavaScript to run this app. 如何在React Query useMutation成功回调中获取HTTP响应状态码
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Query useMutation成功回调中获取HTTP响应状态码

从React Query成功的Mutation请求中获取HTTP状态码的实现方案

核心问题原因

你当前的实现有个基础问题:封装的validateIban函数调用axios发请求后,根本没把响应结果return出去。React Query的useMutation只会把请求函数return的内容作为onSuccess的入参,现在函数返回的是空值,自然拿不到状态码。

实现步骤

1. 修改底层请求函数,透传响应结果

调整validateIban的逻辑,把axios请求的完整响应对象返回出去:

const validateIban = async (accountId, encodedIban) => {
    // 直接return axios的响应对象,不要await后丢弃返回值
    return axios.post(
        `${CUSTOMER_PORTAL_API}/policy/accounts/${accountId}/iban/${encodedIban}`
    );
};

export function useValidateIban(accountId) {
    return useMutation(encodedIban => validateIban(accountId, encodedIban));
}

2. 在成功回调中读取状态码

当请求函数返回完整的axios响应后,onSuccess回调的第一个入参就是这个响应对象,直接读取status字段就能拿到202、204这类成功请求的HTTP状态码:

const validateIbanQuery = useValidateIban(accountId)

validateIbanQuery.mutate(encodeURIComponent(iban), {
    // 入参就是之前请求函数返回的axios响应对象
    onSuccess: (response) => {
        // 直接读取HTTP状态码
        const httpStatus = response.status
        // 按不同状态码写对应逻辑即可
        if (httpStatus === 204) {
            // 处理204无响应体的成功场景
        }
        if (httpStatus === 202) {
            // 处理202已接收的异步校验场景
        }
    },
    onError: (error) => {
        // 原有错误逻辑不需要修改,保持即可
        if (error.response.status === 400) {
            ....
        }
        if (error.response.status === 403) {
            ....
        }
    }
})

优化说明

如果不想把包含大量冗余配置的完整axios响应透传给React Query,可以在请求层按需裁剪需要的字段,减少无用数据:

const validateIban = async (accountId, encodedIban) => {
    const response = await axios.post(
        `${CUSTOMER_PORTAL_API}/policy/accounts/${accountId}/iban/${encodedIban}`
    );
    // 只返回业务逻辑实际需要的字段
    return {
        statusCode: response.status,
        result: response.data
    };
};

调整后onSuccess中直接读取statusCode即可拿到对应状态码。

内容的提问来源于stack exchange,提问作者btrautmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 14:36:04