Utiliser un middleware spécifique dans Express pour tous les chemins sauf un spécifique

J’utilise le framework Express dans node.js avec quelques fonctions de middleware:

var app = express.createServer(options); app.use(User.checkUser); 

Je peux utiliser la fonction .use avec un paramètre supplémentaire pour utiliser ce middleware uniquement sur des chemins spécifiques:

 app.use('/userdata', User.checkUser); 

Est-il possible d’utiliser la variable path pour que le middleware soit utilisé pour tous les chemins sauf un chemin spécifique, c’est-à-dire le chemin racine?

Je pense à quelque chose comme ceci:

 app.use('!/', User.checkUser); 

Donc, User.checkUser est toujours appelé sauf pour le chemin racine.

J’appendais le middleware checkUser à tous mes chemins, à l’exception de la page d’accueil.

 app.get('/', routes.index); app.get('/account', checkUser, routes.account); 

ou

 app.all('*', checkUser); function checkUser(req, res, next) { if ( req.path == '/') return next(); //authenticate user next(); } 

Vous pouvez étendre cela avec un soulignement pour rechercher le req.path dans un tableau de chemins non authentifiés:

 function checkUser(req, res, next) { var _ = require('underscore') , nonSecurePaths = ['/', '/about', '/contact']; if ( _.contains(nonSecurePaths, req.path) ) return next(); //authenticate user next(); } 

Au lieu d’enregistrer directement User.checkUser tant que middleware, enregistrez une nouvelle fonction d’assistance, par exemple checkUserFilter , appelée sur chaque URL, mais transmettant l’exécution à userFiled` uniquement sur des URL données. Exemple:

 var checkUserFilter = function(req, res, next) { if(req._parsedUrl.pathname === '/') { next(); } else { User.checkUser(req, res, next); } } app.use(checkUserFilter); 

En théorie, vous pouvez fournir des chemins d’expression rationnelle vers app.use . Par exemple, quelque chose comme:

 app.use(/^\/.+$/, checkUser); 

Je l’ai essayé sur express 3.0.0rc5, mais cela ne fonctionne pas.

Peut-être pourrions-nous ouvrir un nouveau ticket et le proposer comme fonctionnalité?

Vous pouvez également définir le middleware pour chaque itinéraire.

 // create application/x-www-form-urlencoded parser var urlencodedParser = bodyParser.urlencoded({ extended: false }) // POST /login gets urlencoded bodies app.post('/login', urlencodedParser, function (req, res) { if (!req.body) return res.sendStatus(400) res.send('welcome, ' + req.body.username) }) 

Utilisation

 app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){... 

Cela passe n’importe quelle URL en dehors de /. A moins que ça ne marche pour moi.

En général

 /^(\/path.+|(?!\/path).*)$/ 

(voir Comment annuler un mot spécifique dans regex? )

J’espère que cela t’aides