express框架使用axios进行post请求跨域问题,以及返回的数据是undefined的问题

在Express框架下使用axios进行POST请求时遇到跨域问题和前端接收到的数据是undefined。解决方法包括在Express应用中配置请求头以允许跨域,并在Vue项目中使用qs库重新初始化axios。在Node.js接口中,通过JSON.parse和JSON.stringify转换数据,确保前端能够正确接收和解析数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在express框架中使用axios的post方法出现报错,报跨域问题,前端拿到的json数据是undefined

先想要解决这个问题需要自己定义请求头,并且在vue中使用qs重新实例化一个axios,这个项目使用vue做前端框架,使用express写后台接口。

  1. 首先在express的app.js文件里设置携带请求头信息
var app = express();
app.use("*",function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  if (req.method === 'OPTIONS') {
    res.send(200)
  } else {
    next()
  }
})
  1. 在vue里面npm i --save qs,重新实例化一个axios
 let instance = this.axios.create({
                headers: {'content-type': 'application/x-www-form-urlencoded'}
            }); 

在这里插入图片描述
如此就能解决使用post请求报跨域的问题,接下来讲用node.js写接口在express框架运行能拿到数据,但是前端拿到的数据是undefined的问题。
其实只要在后台将数据处理一下返回前段即可,主要在后端使用JSON的parse和stringify进行转换(这里说的只是用express框架,使用node.js写后台接口的情况
1.将JSON对象转换为字符串
2.将JSON字符串转换为对象
在这里插入图片描述
此时在前端拿到的数据就是可以进行正常渲染
在这里插入图片描述

<think>嗯,用户的问题是关于前端传递非空字段到后端却变成undefined的情况。我需要先分析可能的原因,然后给出解决方案。首先,可能的原因可能包括字段名称不一致、前端未正确序列化数据请求配置问题、后端框架解析问题,或者网络请求库的配置错误。接下来,我需要逐一分析这些可能性,并给出对应的解决方法。例如,检查前后端字段名是否一致,使用开发者工具查看请求载荷是否正确,配置CORS,处理Content-Type头部等。同时,要确保用户使用POST方法发送JSON数据,并正确使用axios等库。可能还需要提醒用户检查后端框架的注解或配置,比如Spring的@RequestBody。最后,生成相关问题,帮助用户扩展解决其他可能的类似问题。</think>### 前端发送非空字段但后端接收到`undefined`的原因及解决方案 #### 一、常见原因分析 1. **字段名称不一致** 前端发送的字段名与后端接收的参数名大小写/拼写不一致,例如前端发送`userName`,后端接收`username`[^1]。 2. **请求未正确序列化** 前端未将数据转为标准格式(如未使用`JSON.stringify`),导致后端无法解析: ```javascript // 错误示例(未序列化) axios.post('/api', { name: 'John' }); // 正确示例(明确设置Content-Type) axios.post('/api', JSON.stringify({ name: 'John' }), { headers: { 'Content-Type': 'application/json' } }); ``` 3. **请求配置问题** 请求未携带必要头信息时,可能导致预检请求失败,触发`OPTIONS`方法过滤有效载荷[^2]。 4. **框架解析机制差异** 如Spring Boot要求使用`@RequestBody`注解接收JSON数据,Node.js Express需要`body-parser`中间件: ```java // Spring Boot示例 @PostMapping("/api") public ResponseEntity<?> create(@RequestBody UserDTO user) { ... } ``` #### 二、系统化解决方案 1. **网络请求验证** 通过浏览器开发者工具(F12→Network)检查: - Payload标签页是否包含有效数据 - Request Headers中`Content-Type`是否为`application/json` - 请求方法是否为POST/PUT(GET请求无法携带body) 2. **前后端字段映射验证** 使用全小写+下划线命名法保持一致性: ```javascript // 前端发送 { user_name: 'John' } ``` ```java // Java后端DTO public class UserDTO { private String userName; // 需要与前端完全一致 // 或使用@JsonProperty("user_name") } ``` 3. **配置强化** 后端需显式声明允许的Headers: ```java // Spring Boot配置示例 @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("Content-Type"); } }; } ``` 4. **请求库深度配置** Axios需要设置`transformRequest`处理特殊数据类型: ```javascript axios.create({ transformRequest: [(data) => { return JSON.stringify(data); }] }); ``` #### 三、扩展验证场景 - 测试空字符串`""`与`null`的传输差异 - 验证文件上传时`multipart/form-data`格式的特殊处理 - 检查网络代理是否篡改请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值