web-dev-qa-db-fra.com

Accéder à la variable "app" à l'intérieur du middleware ExpressJS / ConnectJS?

Ce n'est peut-être pas la bonne approche, mais je veux ajouter conditionnellement un objet/paramètre à la variable app à l'intérieur d'un appel middleware expressJS/connectjS.

Étant donné que cette fonction est un rappel, quelle est la meilleure façon/standard d'accéder à app depuis un appel middleware?

  //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();
    }
  };

Notez que ce n'est pas quelque chose que locals ou settings sera rendu plus tard, mais quelque chose qui sera utilisé dans les routes et les sockets plus tard dans la chaîne d'exécution.

36
qodeninja

Les objets de demande ont un champ app. Utilisez simplement req.app pour accéder à la variable app.

104
Nitzan Shaked

En général, je fais ce qui suit.

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

Et le middleware ressemblerait à ceci ...

module.exports = function(app) {
  app.doStuff.blah()

  return function(req, res, next) {
    // actual middleware
  }
}
10
Morgan ARR Allen

Vous pouvez également attacher une variable à l'objet global Node, comme ceci:

//some-module.js
global.someVariable = "some value!";

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

Notez que la réponse de Nitzan Shaked (en utilisant req.app) est une bien meilleure approche.

En fait, je ne conseille pas du tout d'utiliser cette solution. Je le laisse uniquement pour être complet, car cela fonctionne, mais c'est une mauvaise pratique dans presque toutes les situations (sauf l'ajout de polyfills).

4
Andrew Faulkner