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

React中axios POST对接MySQL后端报错 Postman测试同接口正常

问题描述

对接MySQL数据库的后端服务用Postman测试所有用户相关路由均可正常运行,但前端React项目通过axios发起POST请求时返回服务端错误,核对提交的所有参数值均正确,无法定位问题原因。
报错截图

相关代码

前端Formik自定义输入组件代码

import React from "react";
import {ErrorMessage, useField } from 'formik';

export const TextField = ({ label, ...props}) => {
    const [field, meta] = useField(props);
    return (
        <div className="input-form">
            <label htmlFor={field.name}>{label}</label>
            <input className={`form ${meta.touched && meta.error && 'is-invalid'}`} {...field} {...props} />
            <ErrorMessage component="div" name={field.name} className="error"/>
        </div>
    )
}

前端登录页Formik+axios请求代码

import React from "react";
import {Formik, Form} from 'formik';
import { TextField } from "./TextField";
import * as Yup from 'yup';
import axios from "axios";

export const Login = () => {

    const validate = Yup.object({
        email: Yup.string()
          .email('Email is invalid')
          .required('Email is required'),
        password: Yup.string()
          //.min(6, 'Password must be at least 6 charaters')
          .required('Password is required'),
      })

   
    return (
        <Formik initialValues={{
            email: '',
            password: '',
        }}   validationSchema={validate}
        onSubmit={values => {
            
            axios({
                method: "post",
                url: `http://localhost:3001/api/auth/login`, values,
              }).then(function (res) {
                console.log("envoie-avant erreur")
                console.log(res);
                console.log(res.values);
                console.log("values");
              }).catch((err) => {
                  console.log(err); 
                  console.log("error-value")
                  console.log(values)
                  console.log("lecture de values après refus")
                });
            console.log(values)
            console.log("test-values")
        }}
        >
            
        { formik => (
          <div className="size-column-form">
          <h1>Login</h1>
           <Form>
                <TextField label="Email" name="email" type="email"/> 
                <TextField label="password" name="password" type="password"/>
                <button className="btn-bleu" type="submit">Se Connecter</button>               
           </Form>
      </div>
        )}
    </Formik>
    )
}

后端Express配置(路由+CORS)代码

const express = require("express");
//创建express应用
const path = require("path");
const Sequelize = require("sequelize");
const app = express();


//环境变量配置
require("dotenv").config();
console.log(process.env);

//路由导入
const authRoutes = require("./routes/user");

//解析json格式请求体
app.use(express.json());

const cors = require('cors');
const corsOptions ={
    origin:'http://localhost:3000/', 
    credentials:true,
    optionSuccessStatus:200
}
app.use(cors({credentials: true, origin: 'http://localhost:3000/'}));

// 全局CORS处理中间件
app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content, Accept, Content-Type, Authorization",
    "x-access-token, Origin, Content-Type, Accept"
  );
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, PUT, DELETE, PATCH, OPTIONS"
  );
  next();
});

//静态资源托管
app.use("/images", express.static(path.join(__dirname, "images")));

//路由挂载
app.use("/api/auth", authRoutes);

module.exports = app;
问题原因与修复方案

问题由两处错误共同导致,按以下顺序修改即可:

  1. axios请求参数写法错误(核心原因)
    你当前的axios配置写法不符合语法规范,POST请求的请求体参数必须通过data字段声明,直接把values写在配置对象中不会被识别为请求体,后端接收不到任何提交参数,自然触发服务端错误。
    将axios请求部分修改为:
axios({
    method: "post",
    url: "http://localhost:3001/api/auth/login",
    data: values // 明确指定data字段承载请求参数
})

也可以直接用axios的post方法简写:

axios.post("http://localhost:3001/api/auth/login", values)
  1. 后端CORS配置冲突
    你同时使用了cors第三方中间件和自定义的全局CORS处理中间件,两处配置存在矛盾:cors中指定允许的源为http://localhost:3000/,自定义中间件又将允许源设为通配符*,但开启credentials: true(携带凭证)模式时,Access-Control-Allow-Origin不允许设置为*,会直接触发跨域拦截。
    直接删除自定义的全局CORS中间件代码,统一使用cors包的配置即可,注意去掉origin末尾多余的斜杠:
const corsOptions ={
    origin:'http://localhost:3000', // 删除末尾斜杠
    credentials:true,
    optionSuccessStatus:200
}
app.use(cors(corsOptions));

修改完成后重启后端服务、刷新前端页面重新测试即可正常请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:39:43