MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Woher weiß Express, welcher Router-Pfad verwendet werden soll, wenn mehrere Pfade übereinstimmen?

Um dies vollständig zu verstehen, lesen Sie bitte die Dokumentation:http://expressjs.com/api.html #router.METHODE

So erfassen Expressrouten Pfade

Wenn Sie einen :param verwenden als Teil Ihres Pfads passt es auf alles wie /* , und der erfasste Wert wird in req.params.param gespeichert .

Wenn Sie mehr als eine Regel haben, wird die zuerst registrierte zuerst geprüft. Es überprüft jeden Aufruf anhand jeder Regel, bis eine Übereinstimmung gefunden wird. Wenn Sie next() aufrufen Wenn ihm keine Werte übergeben werden, sucht es nach der nächsten Übereinstimmung (entweder auf derselben Route oder weiter in die nächste Middleware).

Diese drei Regeln werden also alle ausgeführt

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

Wenn ich /user/foobar anfordere , sehe ich die folgende Ausgabe (und wahrscheinlich einen Fehler als Client, weil ich nie geantwortet habe :P)

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

Es wird alle drei treffen, aber der Kontext ist für jeden anders.

Erfassen von Pfadmustern mit regulären Ausdrücken

Wenn Sie separate Routen für die ID (sagen wir alle Zahlen) und den Benutzernamen (alle Buchstaben) erfassen möchten, können Sie dies tun:

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

Beachten Sie die Parathese um meine Fanggruppe. Ohne dies params ist leer. Es erfasst automatisch mit nur * in der Schnur, weil sie nette Leute sind. Ich erhalte Folgendes als Ausgabe, wenn ich gegen die drei verschiedenen Typen laufe.

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

All dies erklärt, Sie öffnen sich für einige Vektoren für Fehler, die Ihr System befallen. Vielleicht möchten Sie über Ihr URL-Muster nachdenken.