Node.js:路由优先级和排序(帆.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被击中,因为它必须与您主页上的资产网址匹配。此路由将匹配任何由三部分组成的路径,例如:

  • /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路线时,我发现这种方法是值得的。但是,维护需要工作,所以如果您认为第一种方法适合您,我会使用它。

最新更新