访问 ExpressJS/ConnectJS 中间件中的“app”变量?

Posted

技术标签:

【中文标题】访问 ExpressJS/ConnectJS 中间件中的“app”变量?【英文标题】:Access "app" variable inside of ExpressJS/ConnectJS middleware? 【发布时间】: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 稍后渲染的东西,而是稍后将在执行链中用于路由和套接字的东西。

【问题讨论】:

【参考方案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 除外)都是不好的做法。

【讨论】:

以上是关于访问 ExpressJS/ConnectJS 中间件中的“app”变量?的主要内容,如果未能解决你的问题,请参考以下文章

咏南中间件修正了一处BUG,调用中间件插件会报:非法访问

node路由访问,中间件返回数据

在 Asp.net 核心中间件中访问 ModelState

laravel / lumen 访问中间件中的 .env 值

访问rails中间件中的路由

访问中间件值以测试Django DetailView