如何设置SailsJS路由以支持pushstate,但仍然可以提供前缀为/api
的请求以及服务静态资产?
使用:
pushState: true
此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
问题
答案 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
文件。
删除以下内容:
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); });
添加:res.redirect("/");
干杯