在NodeJS(Express)中能否在自定义函数内调用app.get()方法?
问题解答
技术层面你的代码可以运行,但这种在请求回调里动态注册路由的方案存在大量隐患,绝对不推荐在生产环境包括你的副业项目中使用,核心问题如下:
- 每次调用
/otherEndpoint接口都会触发路由注册逻辑,哪怕传入的title完全相同,也会给同一路径叠加多个重复的处理函数,后续请求命中该路径时会按注册顺序依次触发所有处理函数,大概率出现逻辑异常 - Express的路由匹配严格遵循注册顺序,如果你后续有固定路径的路由和动态注册的路由规则冲突,会出现匹配结果不符合预期的问题
- 服务重启后所有动态注册的路由会全部丢失,必须重新调用
/otherEndpoint接口才能恢复,数据持久化成本极高 - 若有人恶意调用
/otherEndpoint接口传入大量不同的title,会导致你的服务注册成千上万条无用路由,内存会被持续占用最终引发OOM崩溃,存在严重安全风险
推荐替代方案
你完全可以用固定路由加动态参数的方式实现同样的需求,示例代码如下:
// 预先注册带参数的固定路由,不需要运行时动态生成 app.get('/someEndpoint/:title', (req, res) => { const title = req.params.title; // 在这里写原来的业务逻辑即可 console.log(res); }); app.post('/otherEndpoint', (req, res) => { const title = JSON.stringify(req.body); // 不需要再调用函数注册路由,后续请求直接访问 /someEndpoint/对应的title值即可 // 如果你需要管控合法的title值,可以存在内存数组、缓存或者数据库中,get请求进来时先校验是否存在即可 res.send(`可访问路径:/someEndpoint/${encodeURIComponent(title)}`); });
如果你的业务确实需要做动态路由的管控,也可以把合法的路由规则存在数据库或者配置文件里,服务启动的时候统一加载注册,不要在运行时的请求回调里动态注册。
内容的提问来源于stack exchange,提问作者Brent Deighton
相关产品推荐
相关产品推荐

