[英]How to terminate node.js http request if size is too large?
如果用户的请求大于8mb,我想终止node.js进程中的http服务器。 我当前的代码似乎可以在基本测试中正常工作,但是我不确定res.end()是否异步,是否可以在被process.exit()完成之前销毁。 我在这里使用process.exit是因为,如果用户的请求大于8mb,则在他们发送大量数据时,我不需要保持进程活动。
req.on('data', (chunk) => {
body += chunk;
if(body.length > 8000000) {
res.writeHead(413, defaultHead);
res.end('{"error":"Request exceeded 8mb maximum size."}');
process.exit(0);
}
});
您这样做的方式将起作用,因为body-parser
可以完成同样的事情, body-parser
是用于解析req.body
中的req.body
的流行软件包。
现在, body-parser
工作方式是,它使用另一个名为raw-body
包,该包带有limit
参数,如果当前块> limit,它将调用传递的回调。
function onData (chunk) {
if (complete) return
received += chunk.length
if (limit !== null && received > limit) {
done(createError(413, 'request entity too large', {
limit: limit,
received: received,
type: 'entity.too.large'
}))
} else if (decoder) {
buffer += decoder.write(chunk)
} else {
buffer.push(chunk)
}
}
done
是这里的回调,它会产生一个错误并将其作为回调中的第一个参数推送。
在body-parser
代码中:
getBody(stream, opts, function (error, body) {
if (error) {
var _error= createError(400, error)
// read off entire request
stream.resume()
onFinished(req, function onfinished () {
next(createError(400, _error))
})
return
}
....
next()
})
如果发生错误,它仅使用stream.resume()
读取整个流并传递错误。 因此,基本上,您正在复制一个简单的版本,理论上应该可以使用。
注意, onFinished
是另一个程序包,当HTTP请求关闭,完成或出错时,该程序包执行回调。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.