原理简介

由于表单 POST 请求可能会携带大量的数据,所以在进行请求提交的时候会分为多次提交,具体分为多少次进行提交不一定,取决于数据量的大小
在 Node 中,对于处理这种不确定的数据,使用事件的形式处理
这里可以监听 req 对象的 data 事件,然后通过对应的回调处理函数中的参数 chunk 拿到每一次接收到的数据data,当数据接收完毕之后,会自动触发 req 对象的 end 事件,然后就可以在 end 事件中使用接收到的表单 POST 请求体

代码原理

记得先引入querystring模块

querystring用作分割请求体内容并转化为对象格式

因为有时候会用到文件上传,所以这里要判断数据请求头的content-type,如果是multipart/form-data,则让formidable中间件(涉及到文件提交的,可以参考这篇博客)去处理,否则自己处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app.use((req, res, next) => {
let data = ``
if (req.method.toLowerCase() === 'get') {
return next()
}
// 如果是有文件的表单POST,则不处理
if (req.headers['content-type'].startsWith('multipart/form-data')) {
req.on('data', chunk => {
data += chunk
})
req.on('end', () => {
req.body = queryString.parse(data)
next()
})
}
})