如何设置Sails.js路由以支持前端具有SPA的pushstate

时间:2014-03-31 19:05:27

标签: api express assets sails.js pushstate

如何设置SailsJS路由以支持pushstate,但仍然可以提供前缀为/api的请求以及服务静态资产?

使用:

  • Backbone 1.x with pushState: true
  • Sails 0.10.x

thread的建议解决方案是使用/*通配符并将其全部重定向到索引视图。

/path/to/app/config/routes.js

'/*': {
  view: 'index' 
}

问题是这会将所有内容重定向到索引。包括静态文件资产,express.static中间件似乎没有效果,这条路线以某种方式优先。

此外,下面的这个前缀不会产生任何影响,因为上面的路由优先,但是如果我只删除通配符,前缀是有效的,即'/': { view: 'index' }

/path/to/app/config/blueprint.js

module.exports.blueprints = {
    ...
    prefix: '/api',
    ...
}

显然,这似乎不是一个核心的SailsJS问题,而是我对expressjs路由器的最小知识,因为sailsjs正在使用它。

理论上,我可以明确地列出所有资产前缀路由,并有一个控制器来服务所有,因为它们是众所周知的静态即'/js*': { controller: 'AssetsController', action: 'serve',依此类推'/styles*',{{ 1}},'/images*''/templates*',但我真的犹豫不决,我希望有更好的练习解决方案。

通过通配符'/fonts*'无法解决此路由/api问题

2 个答案:

答案 0 :(得分:8)

如果您愿意使用development version of Sails from GitHub,则可以使用skipRegex路由选项让您的通配符路由忽略API请求,并使用skipAssets选项来使用它忽略资产网址:

'/*' : {view: 'index', skipAssets: true, skipRegex: /^\/api\/.*$/}

否则,您可以创建一个控制器来为您的视图提供服务,并添加代码以跳过操作代码中无意匹配的URL:

// api/controllers/StaticController.js
module.exports = {
   index: function(req, res, next) {
      if (req.path.match(/\..*/g) || req.path.match(/^\/api\/.*$/)) {
         return next();
      }
      return res.view('index');
   }
}

然后在/config/routes.js

'/*': 'StaticController.index'

...

答案 1 :(得分:1)

尝试更新config/404.js文件。

  1. 删除以下内容:

      res.status(result.status);
      res.render(viewFilePath, function (err) {
        // If the view doesn't exist, or an error occured, send json
        if (err) { return res.json(result, result.status); }
    
        // Otherwise, serve the `views/404.*` page
    
        res.render(viewFilePath);
      });
    
  2. 添加:res.redirect("/");

  3. 干杯