我尝试逐行读取流请求并使用split模块。但是当我在数据很大时尝试设置标题连接:关闭时出现错误!
示例代码:
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');
});
}
错误:发送后无法设置标头。
如何在不设置标题的情况下停止浏览器流式传输以及在这种情况下如何正确读取逐行请求流?
答案 0 :(得分: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');
});
});