Node.js Express:如何为指定路由设置更大的json/urlencoded限制
解决方案
Express 没有内置的请求限制白名单机制,但你完全可以通过调整中间件挂载顺序或自定义中间件来实现需求,以下是两种可行方案:
方案1:单独为/admin路由挂载高限制解析中间件
利用 Express 中间件按挂载顺序执行的特性,先为/admin路由单独配置高限制的express.json和express.urlencoded,再挂载全局低限制版本。这样/admin路径的请求会优先使用高限制解析,其他路由走全局低限制。
修改后的代码示例:
const express = require("express"); const app = express(); const adminRoutes = require("./path/to/adminRoutes"); // 先为/admin路由配置高限制的解析中间件 app.use("/api/admin", express.json({ limit: '10MB' })); app.use("/api/admin", express.urlencoded({ limit: '10MB', extended: true })); // 挂载依赖解析后请求体的中间件 // !!! Some middlewares that need the json and urlencoded middleware !!! // 再挂载全局低限制的解析中间件(非/admin路由会触发这里) app.use(express.json({ limit: '50kb' })); app.use(express.urlencoded({ limit: '50kb', extended: true })); // 挂载所有业务路由 app.use("/api/account", accountRoutes); app.use("/api/users", usersRoutes); app.use("/api/news", newsRoutes); app.use("/api/admin", adminRoutes);
方案2:自定义带路径判断的动态解析中间件
如果需要更集中的逻辑控制,可以编写自定义中间件,根据请求路径动态选择解析器:
const express = require("express"); const app = express(); // 预定义两种限制级别的解析器 const lowLimitJson = express.json({ limit: '50kb' }); const highLimitJson = express.json({ limit: '10MB' }); const lowLimitUrlencoded = express.urlencoded({ limit: '50kb', extended: true }); const highLimitUrlencoded = express.urlencoded({ limit: '10MB', extended: true }); // 自定义动态解析中间件 const dynamicBodyParser = (req, res, next) => { if (req.path.startsWith("/api/admin")) { // admin路由使用高限制解析 highLimitJson(req, res, () => { highLimitUrlencoded(req, res, next); }); } else { // 普通路由使用低限制解析 lowLimitJson(req, res, () => { lowLimitUrlencoded(req, res, next); }); } }; // 使用自定义中间件替代全局解析中间件 app.use(dynamicBodyParser); // 挂载依赖解析后请求体的中间件 // !!! Some middlewares that need the json and urlencoded middleware !!! // 挂载所有业务路由 app.use("/api/account", accountRoutes); app.use("/api/users", usersRoutes); app.use("/api/news", newsRoutes); app.use("/api/admin", adminRoutes);
注意事项
- 确保依赖解析后请求体的中间件,挂载在所有解析中间件之后,这样才能正确获取
req.body。 - 若admin路由包含子路径,
req.path.startsWith("/api/admin")会自动覆盖所有子路由场景。
内容的提问来源于stack exchange,提问作者saibot-tsch
相关产品推荐
相关产品推荐

