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