如何在使用express.json({limit: 1500000})中间件时记录请求体大小超限的日志?
如何在使用express.json({limit: 1500000})中间件时记录请求体大小超限的日志?
嗨,我之前刚好处理过一模一样的场景!给你两个亲测有效的方案:
方法一:用全局错误处理中间件捕获超限错误
当express.json()检测到请求体超过设置的limit时,会自动抛出特定类型的错误。我们只需要写一个全局错误处理中间件,就能精准捕获这个错误并记录日志。
首先保留你原本的中间件配置:
app.use(express.json({ limit: 1500000 })); // 1.5MB大小限制
然后一定要把下面的错误处理中间件放在所有路由和其他中间件的最后(注意必须包含err, req, res, next四个参数,Express才会识别它是错误处理中间件):
app.use((err, req, res, next) => { // 判断是否是请求体过大的错误(兼容不同版本的Express/body-parser) if (err.code === 'LIMIT_PAYLOAD_SIZE' || err.type === 'entity.too.large') { // 这里替换成你的日志工具,或者用简单的console.log console.log(`[日志] 请求体超限!路径:${req.path},客户端IP:${req.ip},时间:${new Date().toISOString()}`); // 自定义返回给客户端的响应 return res.status(413).json({ success: false, message: '请求体过大,最大允许1.5MB' }); } // 其他类型的错误交给Express默认处理,或者你自己的其他错误逻辑 next(err); });
方法二:前置中间件提前预估请求体大小(可选)
如果你想在解析请求体之前就提前判断(比如通过Content-Length请求头预估大小),可以写一个前置中间件:
app.use((req, res, next) => { const contentLength = req.headers['content-length']; if (contentLength && parseInt(contentLength) > 1500000) { console.log(`[日志] 请求体预估超限!路径:${req.path},客户端IP:${req.ip}`); // 这里可以直接返回错误,或者继续让express.json抛出错误后再处理 return res.status(413).json({ success: false, message: '请求体过大,最大允许1.5MB' }); } next(); }); // 然后再使用express.json中间件 app.use(express.json({ limit: 1500000 }));
不过这个方法有个小局限:如果请求是分块传输(Transfer-Encoding: chunked),请求头里不会有Content-Length,这时候就没法提前判断了,所以还是方法一更靠谱。
备注:内容来源于stack exchange,提问作者jwtrees
相关产品推荐
相关产品推荐

