NavBar地址加载angular模板,但不是根shell

我正在使用Node.JS和Express,Angular.JS以及ACL的节点模块连接angular色。 我想让一个user.status为“Platinum”的用户访问“Platinum”,而不是“Gold”,反之亦然。

我有ACL部分工作,如果我input/白金导航栏我不能访问/黄金,但是当我尝试访问/白金我只得到模板,而不是根shell,所以会出现这样的:

You made it! You have the {{status}} status! 

如果我点击一个angular度到/ Platinum的链接,一切都会按照原样进行。 如果我在导航栏中input任何中性地址,则一切正常。

这应该是一个简单的解决scheme,但我还没有弄明白。

这里是设置授权的代码,我很确定这里的一切都没问题。

 ConnectRoles = require('connect-roles') var user = new ConnectRoles({ failureHandler: function(req, res, action){ var accept = req.headers.accept || ''; res.status(403); if(accept.indexOf('html')) { res.render('access-denied', {action: action}); } else { res.send('Access Denied - You don\'t have permission to: ' + action); } } }); var app = express(); app.use(user.middleware()); // Setting up user authorizations, // ie if req.user.status = "Platinum", they are given Platinum status user.use('Platinum', function(req) { if (req.user.status == 'Platinum') { return true; } }); user.use('Gold', function(req) { if (req.user.status == 'Gold') { return true; } }); user.use('Admin', function(req) { if (req.user.status == 'Admin') { return true; } }); 

这设置授权,现在问题在于路由下面。

 app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); app.get('/Platinum', user.is('Platinum'), function(req, res) { //Obviously the code below is wrong. res.render('templates/support/Platinum'); }); app.get('/Gold', user.is('Gold'), function(req, res) { res.render('templates/support/Gold'); }); 

你在服务器端configuration路由的方式(使用express)是不正确的。 对于像AngularJS这样的单页面应用程序,您需要为客户端上的页面执行所有的路由(即在Angular中)。 尽pipe如此,服务器仍然为API请求(例如获取和发布数据)和静态资源(index.html,部分HTML文件,图像,JavaScript,字体等)定义路由。

因此下面的代码在你的服务器端JS是错误的:

 app.get('/Platinum', user.is('Platinum'), function(req, res) { //Obviously the code below is wrong. res.render('templates/support/Platinum'); }); app.get('/Gold', user.is('Gold'), function(req, res) { res.render('templates/support/Gold'); }); 

只要删除这些线。

相反,你需要定义服务器将要处理的路由,例如你的/login后的路由,以及如何获得静态文件(我build议在URL中使用/pub作为前缀)。 然后,如果没有路线匹配,则需要在此答案中执行类似于技巧的操作,以返回index.html页面。

这样,当用户键入http://localhost:port/Gold ,express将会看到没有为/Gold定义的路由,所以它将返回index.html ,这将加载AngularJS,运行您的Angular应用程序,然后看看这个URL是否与你的AngularJS应用configuration的路由相匹配,如果是这样的话,获取该页面的部分,并将其插入到你的ng-view (如果使用核心路由器)。