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.

2voto

Milad Raeisi Points 306

La solution consiste à utiliser l'ordre de paramétrage de l'api et du middleware. Dans votre cas, cela doit être quelque chose comme ceci.

 var app = express.createServer(options);

    // put every api that you want to not use checkUser here and before setting User.checkUser
    app.use("/", (req, res) => res.send("checkUser middleware is not called"));

    app.use(User.checkUser);

    // put every api that you want use checkUser
    app.use("/userdata", User.checkUser, (req, res) =>
      res.send("checkUser called!")
    );

Il s'agit d'un exemple complet.

const express = require("express");
const app = express();
const port = 3002;

app.get("/", (req, res) => res.send("hi"));

app.use((req, res, next) => {
  console.log("check user");
  next();
});

app.get("/checkedAPI", (req, res) => res.send("checkUser called"));

app.listen(port, () => {
  console.log(`Server started at port ${port}`);
});

0voto

theBird Points 11

La solution de @chovy est la meilleure.

Une autre solution est :

J'étais confronté à un problème similaire. Ce que j'ai fait, c'est de diviser les fonctions du fichier "routes" en plusieurs fichiers et de les exporter séparément. De même, je les ai importées dans le fichier "server" séparément et j'ai appelé les middlewares pour les routes respectives. Mais je ne recommanderais pas cette méthode à grande échelle, j'avais un petit projet de moins de 10 routes et cela ne m'a pas dérangé de le faire. Pour une mise à l'échelle, j'opterais pour la méthode de Chovy.

0voto

Roman Points 257

La chose qui a fonctionné pour moi est d'initialiser la route unique que vous voulez avant d'initialiser le contrôle for-all, par exemple :

var app = express.createServer(options);

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

app.use(User.checkUser);

Mon exemple personnel est celui-ci et fonctionne :

const app = express();

...

app.use('/api/flow', flowLimiter, flowRouter);

app.use(csurf({
    cookie: false,
}));

...

Alors csurf est appliqué à toutes les routes sauf api/flow - où j'utilise sendBeacon, donc je ne pouvais pas lui appliquer des headers avec des tokens.

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