Node.js:路由优先顺序(sails.js)
Node.js:Route precedence and ordering (sails.js)
在我的 sails.js
应用程序中,我有两条这样的路线:
'/': {controller:'HomeController',action:'home'},
'GET /:category/:subcategory/:keyword':{controller:'SearchController',action:'index'
当我运行默认路由(/
)时它会一直执行这条路由
GET /:category/:subcategory/:keyword
.
为什么会这样??
路由文件中路由的顺序是
1) /
2) GET /:category/:subcategory/:keyword
如上面的评论所述,您的通用路由 /:category/:subcategory/:keyword
被命中,因为它必须与您主页上的资产 URL 匹配。此路由将匹配任何三部分路径,例如:
/images/icons/smiley.png
/scripts/thirdparty/jquery.min.js
等等!
有两种方法可以解决这个问题。一种方法是使您的 SearchController
网址更具体。也许 /search/:category/:subcategory/:keyword
是个好主意?这是最简单的,应立即清除与您的资产的任何冲突。
但是如果你真的需要可以干扰其他特定路由的捕获所有路由,那么解决方案是先捕获特定路由。例如,在 routes.js
:
'GET /images/*': 'RouteController.showAsset',
'GET /scripts/*': 'RouteController.showAsset',
'GET /styles/*': 'RouteController.showAsset',
//...
'GET /:category/:subcategory/:keyword': 'SearchController.index',
然后使用以下方法创建控制器RouteController
:
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);
},
您可能需要先添加一些内容来检查文件是否存在,但这是我们的想法。
当我想要一条不会与我的所有 /contact
、/about
、/robots.txt
、[=23= 冲突的 /:userName
路线时,我发现这种方法是值得的]] 等。但是,它需要工作来维护,所以如果您认为第一种方法适合您,我会使用它。
在我的 sails.js
应用程序中,我有两条这样的路线:
'/': {controller:'HomeController',action:'home'},
'GET /:category/:subcategory/:keyword':{controller:'SearchController',action:'index'
当我运行默认路由(/
)时它会一直执行这条路由
GET /:category/:subcategory/:keyword
.
为什么会这样??
路由文件中路由的顺序是
1) /
2) GET /:category/:subcategory/:keyword
如上面的评论所述,您的通用路由 /:category/:subcategory/:keyword
被命中,因为它必须与您主页上的资产 URL 匹配。此路由将匹配任何三部分路径,例如:
/images/icons/smiley.png
/scripts/thirdparty/jquery.min.js
等等!
有两种方法可以解决这个问题。一种方法是使您的 SearchController
网址更具体。也许 /search/:category/:subcategory/:keyword
是个好主意?这是最简单的,应立即清除与您的资产的任何冲突。
但是如果你真的需要可以干扰其他特定路由的捕获所有路由,那么解决方案是先捕获特定路由。例如,在 routes.js
:
'GET /images/*': 'RouteController.showAsset',
'GET /scripts/*': 'RouteController.showAsset',
'GET /styles/*': 'RouteController.showAsset',
//...
'GET /:category/:subcategory/:keyword': 'SearchController.index',
然后使用以下方法创建控制器RouteController
:
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);
},
您可能需要先添加一些内容来检查文件是否存在,但这是我们的想法。
当我想要一条不会与我的所有 /contact
、/about
、/robots.txt
、[=23= 冲突的 /:userName
路线时,我发现这种方法是值得的]] 等。但是,它需要工作来维护,所以如果您认为第一种方法适合您,我会使用它。