2017-09-29 1 views
1

In meiner sails.js Anwendung ich habe zwei Routen wie folgt aus:Node.js: Route Vorrang und Ordnung (sails.js)

'/': {controller:'HomeController',action:'home'}, 

    'GET /:category/:subcategory/:keyword':{controller:'SearchController',action:'index' 

Wenn ich die Standardroute (/) laufen wird es immer diese Route ausführen GET /:category/:subcategory/:keyword.

Warum passiert das ??

Die Reihenfolge der Routen in der Routendatei ist

1) /

2) GET /:category/:subcategory/:keyword

+0

'GET /: Kategorie /: Unterkategorie /: Schlüsselwort' ist ein bisschen wie sagen 'GET/*/*/*' so wahrscheinlich es entspricht Ihrem '/' .. Wenn Sie als nächstes auf nicht passenden Routen in Ihrem aufrufen 'GET /: category ...', können Sie die Reihenfolge umkehren, damit sie zuerst überprüft wird. – Keith

+0

Also muss ich 'GET /: category /: subcategory /: keyword' route an erster Stelle ?? – Jabaa

+0

Eigentlich nein .. ich glaube nicht, dass das Sinn macht .. ähm .. ich habe sails.js nicht wirklich benutzt .. aber ich habe das Gefühl du könntest 'GET/'auf der ersten Route haben. – Keith

Antwort

1

Wie oben im Kommentar erwähnt, /:category/:subcategory/:keyword Ihre ganz allgemeine Route getroffen wird, weil sie Inhalt übereinstimmen müssen URLs auf Ihrer Homepage. Diese Route wird passen jeden dreiteiligen Weg, ex:

  • /images/icons/smiley.png
  • /scripts/thirdparty/jquery.min.js

Etc!

Es gibt zwei Ansätze, um dies zu beheben. Man würde Ihre SearchController URLs spezifischer machen. Vielleicht wäre /search/:category/:subcategory/:keyword eine gute Idee? Dies ist das einfachste und sollte Konflikte mit Ihren Assets sofort beseitigen.


Aber wenn Sie wirklich catch alle müssen Routen, die mit anderen spezifischen Routen stören können, dann ist die Lösung zunächst die spezifischen Routen zu fangen. Zum Beispiel in routes.js:

'GET /images/*': 'RouteController.showAsset', 
'GET /scripts/*': 'RouteController.showAsset', 
'GET /styles/*': 'RouteController.showAsset', 
//... 
'GET /:category/:subcategory/:keyword': 'SearchController.index', 

Erstellen Sie dann einen Controller RouteController mit der Methode:

showAsset: function(req, res) { 
    var pathToAsset = require('path').resolve('.tmp/public', req.path); 
    // ex should be '.tmp/public/images/icons/smiley.png' 
    return res.sendfile(pathToAsset); 
}, 

Sie müssen möglicherweise etwas hinzufügen zunächst Datei Existenz zu überprüfen, aber das ist die Idee.

fand ich diesen Ansatz sinnvoll, wenn ich eine /:userName Strecke wollte, die mit allen nicht meiner widerspräche /contact, /about, /robots.txt, /favicon.ico usw. Allerdings dauert es Arbeit so zu halten, wenn Sie der erste Ansatz denken arbeiten kann für dich würde ich das benutzen.

+0

Lassen Sie mich Ihre Antwort versuchen – Jabaa

+0

Danke, es funktioniert :) – Jabaa

Verwandte Themen