[英]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.