如何让两个Express中间件共享顶部声明的变量(非req/res传递)
解决Express中间件共享全局变量的问题
你当前的写法存在两个核心问题:
- 传入
app.use的第二个高阶函数被添加了testData参数,Express调用该函数时会把请求对象req传入这个参数,而非你顶部声明的全局变量,同时这个参数还覆盖了外层作用域的testData,导致输出undefined - 这个高阶函数没有被执行,Express会把它本身当成中间件,而非它返回的函数,无法触发内部的逻辑
方案一:简洁版(直接利用闭包)
不需要额外的高阶函数,第二个中间件直接在当前作用域下编写,通过闭包就能访问到顶部的testData变量:
... var testData = "initial Data" app.use("/", function(req, res, next){ testData = "Changed data" next() }, function(req, res, next){ console.log(testData) // 直接读取外层作用域的testData,值为"Changed data" next() }) ...
方案二:保留高阶函数的修正版
如果一定要用高阶函数结构,需要去掉多余参数并执行高阶函数,让它返回真正的中间件:
... var testData = "initial Data" app.use("/", function(req, res, next){ testData = "Changed data" next() }, // 去掉testData参数,避免覆盖外层变量 function(){ return function(req, res, next){ console.log(testData) // 通过闭包访问更新后的testData next() } }()) // 执行高阶函数,返回中间件给Express ...
两种方案的核心都是利用JavaScript的闭包特性,让第二个中间件能直接访问外层作用域的testData变量,第一个中间件修改后的值会被第二个中间件正确读取到,完全不需要依赖req、res或res.locals传递数据。
内容的提问来源于stack exchange,提问作者Canter master mastercanter
相关产品推荐
相关产品推荐

