节点流line-by-line: 发送后无法设置headers
Node stream line-by-line: Can't set headers after they are sent
我尝试逐行读取流请求并为其使用拆分模块。但是当我尝试 set header connection:close 当数据很大时出现错误!
示例代码:
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');
});
}
错误:发送后无法设置 headers。
如何在不设置 header 的情况下停止浏览器流式传输以及在这种情况下如何正确读取 line-by-line 请求流?
问题是,一旦大小超过 1024,并且您发回响应,data
事件将继续发出,因此下一行 after大小超过 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');
});
});
我尝试逐行读取流请求并为其使用拆分模块。但是当我尝试 set header connection:close 当数据很大时出现错误!
示例代码:
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');
});
}
错误:发送后无法设置 headers。
如何在不设置 header 的情况下停止浏览器流式传输以及在这种情况下如何正确读取 line-by-line 请求流?
问题是,一旦大小超过 1024,并且您发回响应,data
事件将继续发出,因此下一行 after大小超过 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');
});
});