Node.js:路由优先级和排序(sails.js)

时间:2017-09-29 18:53:21

标签: javascript node.js express 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

1 个答案:

答案 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路线时,我发现这种方法是值得的,但是,它需要维护,所以如果你认为第一种方法对你有用,我会用它。