You need to enable JavaScript to run this app. 如何在Express中创建仅执行一次的全局中间件
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:54:03