在Express.js请求处理函数中修改app设置是否为良好开发实践?
在Express.js的请求处理程序中修改应用设置是否属于良好的开发实践?
这种做法不属于良好开发实践,是应该严格规避的错误写法。
存在的核心问题
- 全局配置共享导致污染:Express的
app.set存储的是应用级别的全局配置,所有请求共享同一个app实例。在单个请求处理逻辑中修改全局配置,会影响所有后续请求的运行逻辑,完全不满足不同请求之间的隔离要求。比如示例代码中只要有一次请求访问了/somehow路由,所有其他路由获取app.get('title')的结果都会变成New title。 - 并发场景触发竞态问题:如果有多个请求同时修改同一个全局配置,最终的配置值完全取决于请求的执行时序,会出现不可预期的运行结果,这类竞态bug极难复现和排查。
- 不符合框架设计约定:Express的app设置本身设计为启动阶段初始化的固定配置,运行时动态修改属于超出设计预期的用法,后续框架版本升级很可能出现兼容性问题。
正确实现方案
如果需要存储和当前请求相关的自定义变量,直接挂载到req对象即可,不会影响其他请求:
var express = require('express') var app = express() // 全局配置仅在应用启动、监听端口之前完成设置 app.set('title', 'My Site') app.get('/somehow', function (req, res) { // 单个请求的自定义变量挂载到req对象,仅当前请求可见 req.customTitle = 'New title' // 如果是要传递给视图模板的变量,也可以使用官方提供的res.locals res.locals.title = 'New title' res.send('hello world') }) app.listen(3000)
内容的提问来源于stack exchange,提问作者Molfar
相关产品推荐
相关产品推荐

