MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment Express sait-il quel chemin de routeur utiliser lorsque plusieurs chemins correspondent ?

Pour bien comprendre cela, veuillez lire la documentation :http://expressjs.com/api.html #router.METHOD

Comment les itinéraires express capturent les chemins

Lorsque vous utilisez un :param dans le cadre de votre chemin, il correspond à tout comme /* , et la valeur capturée est stockée dans req.params.param .

Lorsque vous avez plusieurs règles, la première enregistrée est la première vérifiée. Il vérifie chaque appel par rapport à chaque règle jusqu'à ce qu'une correspondance soit trouvée. Si vous appelez next() sans qu'aucune valeur ne lui soit transmise, il recherchera la correspondance suivante (soit dans la même route, soit dans le middleware suivant).

Donc ces trois règles seront toutes exécutées

var handleRoute = function(req, res, next){
   console.log(req.path + ' ' + req.params.id + ' ' + req.params.user + ' ' + req.params[0]);
   next();
}

route.route('/user/:id').get(handleRoute);
route.route('/user/:user').get(handleRoute);
route.route('/user/*').get(handleRoute);

Lorsque je demande /user/foobar , je verrai la sortie suivante (et probablement une erreur en tant que client car je n'ai jamais répondu :P)

/user/foobar foobar undefined undefined
/user/foobar undefined foobar undefined
/user/foobar undefined undefined foobar

Il touchera les trois, mais le contexte est différent pour chacun.

Comment capturer des modèles de chemin avec des expressions régulières

Si vous souhaitez capturer des routes distinctes pour l'identifiant (disons tous les chiffres) et le nom d'utilisateur (toutes les lettres), vous pouvez le faire :

var handleRoute = function(tag) {
  return function(req, res, next) {
    console.log(tag + ' ' + req.path + ' -> ' + req.params[0]);
    res.status(200)
      .json({
        success: 'yay!'
      });
  };
};

route.route(/^\/user\/([0-9]+)$/i)
  .get(handleRoute('id'));
route.route(/^\user\/([A-Za-z]+)$/i)
  .get(handleRoute('user'));
route.route('/user/*')
  .get(handleRoute('catch all'));

Notez la parathèse autour de mon groupe de capture. Sans cela, params est vide. Il capture automatiquement avec juste * dans la ficelle parce que ce sont des gens sympas. J'obtiendrai ce qui suit pour la sortie lorsque j'exécuterai les trois types différents.

id /user/123 -> 123
user /user/user -> user
catch all /user/user.1 -> user.1

Tout cela expliqué, vous vous ouvrez à certains vecteurs de bogues pour infester votre système. Vous voudrez peut-être réfléchir à votre modèle d'URL.