如果用户向我的 API 发出的请求负载过大,我想拦截服务器抛出的错误并自行处理,以便向客户端发送更详细的 JSON 响应。
我正在使用具有自定义限制的 Express JSON 解析器:
router.use(express.json({ limit: "10kb" }));
如果用户发出的请求超过该限制,他们当前会在客户端收到错误,我似乎无法弄清楚如何在服务器上
try
/catch
以便用 JSON 替换错误回应。
编辑:我通过将限制设置为
Infinity
来解决这个问题,但我觉得可能有更好的解决方案。我认为这不会破坏任何东西,因为我自己仍在处理太大的请求。
您可以编写自己的中间件并将其附加到之前您的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
定义不同的大小限制。
最好的方法是使用中间件。 我使用 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);
});