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与原始数据不一致,接收到的文件损坏。

看到这个 忽然还是觉得express的中间件香[em_24]

v6666
引用
看到这个 忽然还是觉得express的中间件香[em_24]
v6666 看到这个 忽然还是觉得express的中间件香[em_24]

实在不喜欢用第三方的……

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();

})

成功拦截了!

1