在我的sails.js
应用程序中,我有两条这样的路线:
'/': {controller:'HomeController',action:'home'},
'GET /:category/:subcategory/:keyword':{controller:'SearchController',action:'index'
当我运行默认路由(/
)时,它将始终执行此路由
GET /:category/:subcategory/:keyword
。
为什么会这样?
路线文件中的路线顺序为
1)/
2)GET /:category/:subcategory/:keyword
答案 0 :(得分:1)
正如上面的评论所述,您的常规路线/:category/:subcategory/:keyword
正在被点击,因为它必须与您主页上的资产网址相匹配。此路线将匹配任何三部分路径,例如:
/images/icons/smiley.png
/scripts/thirdparty/jquery.min.js
ETC!
有两种方法可以解决这个问题。一个是让你的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);
},
您可能需要先添加一些内容来检查文件是否存在,但这是个主意。
当我想要一条不会与我的所有/:userName
,/contact
,/about
,/robots.txt
冲突的/favicon.ico
路线时,我发现这种方法是值得的,但是,它需要维护,所以如果你认为第一种方法对你有用,我会用它。