【问题标题】:Access "app" variable inside of ExpressJS/ConnectJS middleware?访问 ExpressJS/ConnectJS 中间件中的“app”变量?
【发布时间】:2013-09-23 16:18:52
【问题描述】:

这可能不是我正确的方法,但我想有条件地将对象/参数添加到 expressJS/connectjS 中间件调用内的app 变量。

由于此函数是回调,从中间件调用内部访问app 的标准/最佳方式是什么?

  //app.js
  var myMiddleware = require('./lib/mymiddleware.js');
  ...
  app.configure( function(){
    app.use( myMiddleware.func() );
    ...
  }

  if( 'object' !== typeof app.myObject ){
    cry( 'about it' );
  } 


  //mymiddleware.js
  module.exports.func = function( ){
    return function( req, res, next ){
       //append app object
       //app.myObject = {}
       next();
    }
  };

注意,这不是 localssettings 稍后渲染的东西,而是稍后将在执行链中用于路由和套接字的东西。

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    请求对象有一个app 字段。只需使用req.app 即可访问app 变量。

    【讨论】:

      【解决方案2】:

      通常我会执行以下操作。

      var myMiddleware = require('./lib/mymiddleware.js')(app);
      ...
      app.configure( function(){
        app.use( myMiddleware );
        ...
      }
      

      中间件看起来像这样......

      module.exports = function(app) {
        app.doStuff.blah()
      
        return function(req, res, next) {
          // actual middleware
        }
      }
      

      【讨论】:

      • 我的做法和你一样,不过我喜欢req.app 解决方案。不知道这是可能的。
      • @Plato 我刚刚意识到的问题是这只会更新页面请求上的应用程序对象,我需要在启动过程中更新应用程序对象。
      • 是否有另一种方法可以让应用程序进入函数而不将其传递给 require 函数?
      • @qdeninja:如果这是您的新要求,您应该编辑问题。无论如何,我不清楚“在应用程序启动时”的意思是:请求之外没有req(即:启动时),而您具体说的是“中间件”,这意味着请求,所以我的原始答案应该是好的。还是我错过了什么?
      • @NitzanShaked 我之前并没有真正了解中间件是如何工作的,现在我明白中间件只在页面加载时运行,而不是在启动时运行。我需要在启动阶段更新应用程序对象,以设置全局属性。不过,我希望有一种更标准的方法来做到这一点。当我实际测试您的代码时,我意识到这不是我想要的,我很抱歉。尽管我认为从我写的代码中可以很清楚地看到我正在尝试做的事情typeof app.myObject。要求没有改变,我对问题的理解改变了。
      【解决方案3】:

      您还可以将变量附加到 Node 全局对象,如下所示:

      //some-module.js
      global.someVariable = "some value!";
      
      //another-module.js
      console.log(global.someVariable); // => "some value!"
      

      请注意,Nitzan Shaked 的回答(使用 req.app)是一种更好的方法。

      事实上,我根本不建议使用此解决方案。我只是为了完整性而保留它,因为它可以工作,但在几乎所有情况下(添加 polyfill 除外)都是不好的做法。

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 2018-03-15
        • 2012-03-20
        • 2015-11-15
        • 1970-01-01
        相关资源
        最近更新 更多