当请求体太大时,如何拦截Express抛出的413错误?

问题描述 投票:0回答:2

如果用户向我的 API 发出的请求负载过大,我想拦截服务器抛出的错误并自行处理,以便向客户端发送更详细的 JSON 响应。

我正在使用具有自定义限制的 Express JSON 解析器:

router.use(express.json({ limit: "10kb" }));

如果用户发出的请求超过该限制,他们当前会在客户端收到错误,我似乎无法弄清楚如何在服务器上

try
/
catch
以便用 JSON 替换错误回应。

编辑:我通过将限制设置为

Infinity
来解决这个问题,但我觉得可能有更好的解决方案。我认为这不会破坏任何东西,因为我自己仍在处理太大的请求。

node.js express http error-handling http-status-code-413
2个回答
1
投票

您可以编写自己的中间件并将其附加到之前您的bodyparser。在该中间件中,您可以检查请求的

Content-Length
标头,如果太大则返回错误。

如果您只想对 JSON 正文执行此操作(例如,如果您还允许上传图像),您还可以添加一个条件来检查内容类型

router.use((req, res, next) => {
   //contents other than json don't have a size limit
   //so just continue with the next handler in the chain
   if (!/^application\/json/.test(req.headers['content-type']))
     return next();

   //get the size from content-length header
   let size = +req.headers['content-length'] || 0;
   //if it's too big, return an error status
   if (size > 10000)
     return res.status(413).send("too big ...");

   //continue with the next handler in the chain
   next(); 
});

//as you already checked the size of the body before
//you don't need the limit here anymore
router.use(express.json());

您还可以为各种

content-type
定义不同的大小限制。


0
投票

最好的方法是使用中间件。 我使用 axios 来处理 HTTP 请求。我设置了拦截器来跟踪响应并处理定义的异常。

例如,在任何 403、401 响应中,我将用户导航到 /login。 这是一个示例,您可以修改您的代码,以便在遇到此类响应状态时提供更详细和自定义的响应。

instance.interceptors.response.use(function (response) {
 
    if (response.status === 413) {
 
       const myres = [];
    }
    return myres;
}, function (error) {
    return Promise.reject(error);
});

© www.soinside.com 2019 - 2024. All rights reserved.