101 votes

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 avec un paramètre supplémentaire pour utiliser cet intergiciel uniquement sur des chemins spécifiques :

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

Est-il possible d'utiliser la variable path de manière à ce que l'intergiciel soit utilisé pour tous les chemins sauf un spécifique, à savoir le chemin Root ?

Je pense à quelque chose comme ça :

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

Alors User.checkUser est toujours appelé, sauf pour le chemin Root.

167voto

chovy Points 8012

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 pourriez étendre cette méthode pour rechercher le chemin d'accès à la requête dans un tableau de chemins non authentifiés :

function checkUser(req, res, next) {
  const nonSecurePaths = ['/', '/about', '/contact'];
  if (nonSecurePaths.includes(req.path)) return next();

  //authenticate user
  next();
}

15voto

Vous pouvez également définir l'intergiciel 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)
})

14voto

jsalonen Points 9651

Au lieu d'enregistrer directement User.checkUser en tant qu'intergiciel, enregistre une nouvelle fonction d'aide, par exemple checkUserFilter qui est appelé sur chaque URL, mais qui passe l'exécution à userFiled` seulement sur des URLs donnés. 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 regexp à app.use . Par exemple, quelque chose comme :

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

Je l'ai essayé sur express 3.0.0rc5, mais ça ne fonctionne pas.

Peut-être que nous pourrions ouvrir un nouveau ticket et suggérer que cela soit une fonctionnalité ?

6voto

user1872904 Points 33

Utilisez

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

Cela passe n'importe quelle url en dehors de /. A moins que, cela fonctionne pour moi.

En général

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

(voir Comment nier un mot spécifique dans une expression rationnelle ? )

J'espère que cela vous aidera

3voto

Abhay Shiro Points 759

Utilisez cette bibliothèque appelée express - sauf

Exiger une authentification pour chaque requête, sauf si le chemin est index.html.

app.use(requiresAuth.unless({
  path: [
    '/index.html',
    { url: '/', methods: ['GET', 'PUT']  }
  ]
}))

Il peut s'agir d'une chaîne de caractères, d'un regexp ou d'un tableau de ces éléments. Il peut également s'agir d'un tableau d'objets qui sont des paires de clés d'URL et de méthodes. Si le chemin de la requête ou le chemin et la méthode correspondent, l'intergiciel ne sera pas exécuté.

Cette bibliothèque vous aidera sûrement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X