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

使用React-Query Mutation时触发Axios 415错误求助

问题描述

我有一个用于编辑数据的详情页,最初使用Yup验证配合普通函数调用API可正常运行。相关代码如下:

CustomerEditPage.js

import React from 'react'
import { useMutation, useQueryClient, useQuery } from 'react-query'
import { useForm } from "react-hook-form"
import { yupResolver } from '@hookform/resolvers/yup'
import * as yup from "yup"
import * as api from '../../../service/CustomerDescApi'

const schema = yup.object({
    customerCode: yup.string().required('Customer Code is a required field'),
    taxid: yup.string().required('Tax Id is a required field'),
    nameLocal: yup.string(),
    nameEng: yup.string(),
    address1: yup.string(),
    address2: yup.string(),
    refCompany: yup.string(),
    comCus: yup.string(),
}).required()

const updateCustomer = async (cvid,newdata) => {
    const response = api.UpdateCvdesc(cvid,newdata);
    return response
}

const CustomerEditPage = () => {
const CVID = location.state.ID

const { register, handleSubmit, formState:{ errors }, setValue } = useForm({
        resolver: yupResolver(schema)
    })

setValue('customerCode', customer.customerCode)
setValue('taxid', customer.taxid)
setValue('nameLocal', customer.nameLocal)
setValue('nameEng',customer.nameEng)
setValue('address1',customer.address1)
setValue('address2',customer.address2)
setValue('refCompany',customer.refCompany)
setValue('comCus',customer.comCus)
setValue('status',customer.status)

const onSubmit = (data) => {
    updateCustomer(CVID,data)
}

CustomerDescApi.js

import axios from "axios"

export const MRCAPI = axios.create({
      baseURL: "https://localhost:7257",
      headers: { "Access-Control-Allow-Origin": "*" ,
                  'Content-Type': 'application/json; charset=utf-8' }
})

export const UpdateCvdesc = async (cvid,newdata) => {
   console.log(newdata)
   const response = await MRCAPI.put(`/TestCustomerDesc/${cvid}`, newdata)
   return response.data
}

现在我想在项目中使用React-Query,于是添加了Mutation代码:

CustomerEditPage.js(React-Query版本)

const { mutate } = useMutation(updateCustomer, {
        onSuccess: data => {
          console.log(data);
          const message = "Update Success"
          alert(message)
        },
        onError: () => {
          alert("there was an error")
        },
        onSettled: () => {
          queryClient.invalidateQueries('update');
        }
    })

并修改了提交函数:

const onSubmit = (data) => {
      mutate(CVID,data)
      //updateCustomer(CVID,data)
}

添加React-Query后,我始终收到Axios返回的415(Bad Request)错误,但移除React-Query代码后又能正常运行,请问这是什么原因?


解决方案

问题根源

React Query的mutate函数仅接受单个参数作为传递给mutation函数的数据,你传入的第二个参数data会被React Query识别为mutate的配置选项,而非updateCustomer的第二个参数。

这导致updateCustomer实际只接收到第一个参数CVID,第二个参数newdata为undefined,API接口收到的请求体为空,不符合接口要求的JSON格式,因此返回415(不支持的媒体类型)错误。

另外,你的updateCustomer函数还遗漏了await关键字,会直接返回Promise而非API响应数据,虽不是415的直接原因,但也需要修正。

修复方案

有两种方式可以解决这个问题:

方案1:将参数包装为对象传递

修改updateCustomer函数,接收一个包含所有参数的对象:

const updateCustomer = async ({ cvid, newdata }) => {
    // 补上await,确保拿到API响应
    const response = await api.UpdateCvdesc(cvid, newdata);
    return response
}

修改提交函数,传递对象参数给mutate:

const onSubmit = (data) => {
    mutate({ cvid: CVID, newdata: data })
}

方案2:用数组传递多个参数

修改updateCustomer函数,解构数组参数:

const updateCustomer = async ([cvid, newdata]) => {
    const response = await api.UpdateCvdesc(cvid, newdata);
    return response
}

修改提交函数,传递数组参数给mutate:

const onSubmit = (data) => {
    mutate([CVID, data])
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:50:32