如何在Express中创建仅执行一次的全局中间件
仅执行一次的全局中间件实现方案
根本原因
Express 中间件默认的触发规则是每收到一次客户端请求就完整执行一次,你当前的写法没有做执行状态管控,所以每次访问路由都会重复运行逻辑,自然会多次打印123。
方案1:服务全局仅执行一次(服务启动后全量请求仅跑一次逻辑)
适用于地理定位服务全局配置拉取、基础资源初始化这类不需要区分用户/请求的场景,利用Node.js模块仅加载一次的缓存特性实现:
// userRegion.js 中间件文件 // 定义执行状态标记 let hasExecuted = false module.exports = (req, res, next) => { // 仅未执行过的情况下跑逻辑 if (!hasExecuted) { // 此处替换为你的地理定位逻辑 console.log('123') // 标记为已执行 hasExecuted = true } next() }
挂载方式直接全局挂载即可,所有子路由/页面都会生效:
app.use(userRegion)
方案2:单个用户会话仅执行一次(每个用户首次访问时跑一次)
适用于需要针对每个用户单独定位的场景,需要提前配置好express-session中间件:
module.exports = (req, res, next) => { if (!req.session?.userRegionChecked) { // 此处替换为针对单个用户的定位逻辑 console.log('当前用户首次访问,执行定位') req.session.userRegionChecked = true } next() }
注意事项
如果你的地理定位逻辑是异步的,请将中间件改为async函数,逻辑前加await处理,避免标记提前被赋值导致逻辑未完成就跳过执行。
内容的提问来源于stack exchange,提问作者BL4DERUNNER
相关产品推荐
相关产品推荐

