MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

In che modo Express sa quale percorso del router utilizzare quando più percorsi corrispondono?

Per comprendere appieno questo, leggere la documentazione:http://expressjs.com/api.html #router.METODO

Come le rotte Express acquisiscono i percorsi

Quando usi un :param come parte del tuo percorso, corrisponde a tutto come /* e il valore acquisito viene archiviato in req.params.param .

Quando hai più di una regola, la prima registrata è la prima confrontata. Controlla ogni chiamata rispetto a ogni regola fino a quando non viene trovata una corrispondenza. Se chiami next() senza alcun valore passato, cercherà la corrispondenza successiva (o nello stesso percorso o proseguirà nel middleware successivo).

Quindi queste tre regole verranno eseguite tutte

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);

Quando richiedo /user/foobar , vedrò il seguente output (e probabilmente un errore come client perché non ho mai risposto :P)

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

Toccherà tutti e tre, ma il contesto è diverso per ciascuno.

Come acquisire modelli di percorso con espressioni regolari

Se vuoi acquisire percorsi separati per id (diciamo tutti i numeri) e nome utente (tutte le lettere), puoi farlo:

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'));

Nota la paratesi attorno al mio gruppo di cattura. Senza questo, params è vuoto. Cattura automaticamente con solo * nella stringa perché sono brave persone. Otterrò quanto segue per l'output quando eseguo i tre diversi tipi.

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

Tutto ciò spiegato, ti stai aprendo ad alcuni vettori per i bug che infestano il tuo sistema. Potresti pensare al tuo pattern URL.