0

我尝试逐行读取流请求并使用拆分模块。但是当我尝试设置标头连接时出现错误:数据很大时关闭!

示例代码:

const http = require('http');
const split = require('split');

server.on('request', (req, res) => {
let size = 0;

req
    .pipe(split())
    .on('data', chunk => {
        size += chunk.length;
        if (size > 1024) {
            res.statusCode = 413;
            res.setHeader('Connection', 'close');
            res.end('File is too big!');
        }
    })
    .on('end', () => {
        res.end('OK');        
    });
}

错误:发送后无法设置标头。

如何在不设置标头的情况下停止浏览器流式传输,以及在这种情况下如何正确读取逐行请求流?

4

1 回答 1

1

问题是一旦大小超过 1024,并且您发回响应,data事件将继续发出,因此大小超过 1024的下一行将发回新的 413 响应,这会导致错误(因为您可以只发送一个响应)。

一种选择是使用类似size-limit-stream限制流的大小的东西,并在它发生时触发错误。

像这样的东西:

const limitStream = require('size-limit-stream')

...


server.on('request', (req, res) => {
  let limiter = limitStream(1024).on('error', e => {
    res.statusCode = 413;
    res.setHeader('Connection', 'close');
    res.end('File is too big!');
  });

  req .pipe(split())
      .pipe(limiter)
      .on('data', chunk => {
        // this will emit until the limit has been reached,
        // or all lines have been read.
      })
      .on('end', () => {
        // this will emit when all lines have _succesfully_ been read
        // (so the amount of data fell within the limit)
        res.end('OK');
      });
});
于 2017-08-18T13:35:19.503 回答