在我的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
被击中,因为它必须与您主页上的资产网址匹配。此路由将匹配任何由三部分组成的路径,例如:
/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
、/favicon.ico
等相冲突的/:userName
路线时,我发现这种方法是值得的。但是,维护需要工作,所以如果您认为第一种方法适合您,我会使用它。