【问题标题】:Defined static variable in Expressjs middleware在 Expressjs 中间件中定义静态变量
【发布时间】:2018-03-22 00:50:57
【问题描述】:

代码如下:

   var app = require('express')()
   app.get('/',function(req,res){
            var flag = 0
            console.log(flag)
            res.send('ok')
            flag  ++
    }
    app.listen(3001)

每次我请求 url '/' 时,它都会控制台 '0' 这不是我更喜欢的 'plus plus',并且我不想将 express 中间件之外的变量定义为全局变量。你想告诉我如何在中间件中像静态变量一样使用变量 plus plus。

提前感谢这个小问题。

【问题讨论】:

  • 不要在回调处理程序中声明/分配 var - 在 app 下方立即这样做,然后它应该可以工作。
  • @AlexanderNied 谢谢,但我不想在回调之外声明,我认为这不专业。
  • 在回调之外声明它不会使它成为全局的。 Node 将每个文件中的代码包装在自己的函数中,因此flag 变量将无法在当前文件之外访问。如果您想使用var 进一步限制它,您可以使用IIFE,或者使用let 并将其包装在一个块中。
  • @skirtle 谢谢它很有用,但是用 'let' 代替 'var' ,加号仍然不起作用
  • 只是将var 更改为let 不会解决任何问题,您仍然需要将变量移到函数之外。我提到了let,因为将它包装在块作用域中可以替代使用 IIFE。在实践中,我可能不会打扰任何一个,因为它无论如何都不会是全球性的。

标签: javascript node.js express closures


【解决方案1】:

您可以使用app 对象的locals 属性,用于在应用程序中保持状态的变量

var app = require('express')();

app.locals.flag = 0;

app.get('/',function(req,res){
   console.log(app.locals.flag);
   res.send('ok');
   app.locals.flag++;
});

app.listen(3001);

http://expressjs.com/en/api.html#app.locals

【讨论】:

  • 是的,这是一个很好的建议,是否有可能使用闭包解决这个问题?
  • 不是真正的闭包,但您可以将其包装在 IIFE 中以实现类似的效果 -> jsfiddle.net/8jgq034n ...我更愿意使用 locals 属性,因为这就是它用于
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2014-04-01
  • 2016-06-08
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多