J'utilise le framework Express dans node.js avec quelques fonctions middleware:
var app = express.createServer(options);
app.use(User.checkUser);
Je peux utiliser le .use
fonction 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 spécifique, c'est-à-dire le chemin racine?
Je pense à quelque chose comme ça:
app.use('!/', User.checkUser);
Alors User.checkUser
est toujours appelé sauf pour le chemin racine.
J'ajouterais le middleware checkUser à tous mes chemins, sauf 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 ceci avec un trait de soulignement pour rechercher le chemin 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
en tant que middleware, enregistrez une nouvelle fonction d'assistance, par exemple checkUserFilter
, qui est appelée sur chaque URL, mais transmise à userFiled` uniquement sur les 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 pourriez fournir des chemins d'expression rationnelle à 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 que nous pourrions ouvrir un nouveau ticket et suggérer cela comme une fonctionnalité?
Vous pouvez également définir le middleware sur chaque route.
// 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){...
Cette passe toute URL en dehors de /. Sauf si ça marche pour moi.
En général
/^(\/path.+|(?!\/path).*)$/
(voir Comment nier un mot spécifique dans une expression régulière? )
J'espère que cela t'aides
Utilisez cette bibliothèque appelée express-except
Exigez une authentification pour chaque demande, sauf si le chemin est index.html.
app.use(requiresAuth.unless({
path: [
'/index.html',
{ url: '/', methods: ['GET', 'PUT'] }
]
}))
Le chemin pourrait être une chaîne, une expression rationnelle ou un tableau de ceux-ci. Il peut également s'agir d'un tableau d'objets qui est une paire de clés URL et méthodes. Si le chemin de la demande ou le chemin et la méthode correspondent, le middleware ne s'exécutera pas.
Cette bibliothèque vous aidera sûrement.