NodeJS对POST进行拼合或拦截
NodeJS有一个非常好的特性,就是POST数据是以分段Buffer传入的,每段最大65536字节,也就是64KB。
有两个监听事件分别是:'data'和'end','data'是每接收一个Buffer片段就调用,'end'是全部Buffer接收完毕后调用。
let body = [];
let size = 0;
request.on('data', function (part) {
size += part.length;
//这里可以放置拦截器
body.push(part);
});
request.on('end', function () {
//接收完毕的操作,这里都Buffer进行解析和读取。
});
通过这两个事件,可以很方便地在过程中放置拦截器,如果已接收Buffer过大则拦截,这样NodeJS会停止接收数据。
在接收结束后,要对Buffer进行解析,如果传入的是form表单则要用.toString()转化为字符串,如果是JSON则JSON.parse()
网上教程比较坑的一点是把body.push写成了 body+=,这种情况会造成写入Buffer与原始数据不一致,接收到的文件损坏。
v6666引用看到这个 忽然还是觉得express的中间件香[em_24]
v6666 看到这个 忽然还是觉得express的中间件香[em_24]
都搞错了,有个更香的方法,直接走异步:
const server = http.createServer(async (req, res) => {
const buffers = [];
for await (const chunk of req) {
buffers.push(chunk);
}
const data = Buffer.concat(buffers).toString();
console.log(JSON.parse(data).todo); // 'Buy the milk'
res.end();
})