web-dev-qa-db-fra.com

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 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.

57
Thomas

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

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é?

8
jsalonen

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

2
user1872904

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.

1
Abhay Shiro