Amateur Hour

Express无法解析Axios的POST请求问题解决

2019-03-28

这段时间在捡起来前端,想自己写几个小应用。结果一开始就遇到非常匪夷所思的问题。Axios发的POST请求无法被Express直接解析。

首先,来说一下这个问题出现的原因,归根结底,不管php、java亦或是node。想要在后台接收到POST的数据,都需要POST在发送时使用application/x-www-form-urlencoded,具体操作就是

1
xhr.setRequestHeader("content-type":"application/x-www-form-urlencoded;charset=utf-8")

这应该是最常见的 POST 提交数据的方式了。浏览器的原生

表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样

POST Example Domain HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

通过上面这种方式传值,默认是以表单形式的,所以express设置中是这样的

1
2
3
app.use(bodyParser.urlencoded({ extended: true
}));
//这种方式设置的表单的post请求数据的格式化,同样适用于ajax添加application/x-www-form-urlencoded

可惜,axios默认的Content-type设置的为application/json,通过这种方式发送的数据后台无法通过正常方式获取(原理就不解释了,反正我也不懂)

java和php可以获取到对应的request原始流数据获取到对应的值并将其序列化

但是node怎么办?

express中使用的是body-parser去格式化前台传来的数据,归根结底直接在相关服务中设置
app.use(bodyParser.json())即可,具体实现代码

1
2
3
4
5
6
7
//server.js
var express = require("express")
var app = express(); var bodyParser = require("body-parser") app.use(bodyParser.urlencoded({ extended: true
}));

//在原有的基础上加上下面代码即可
app.use(bodyParser.json()) app.listen(3000)