我有一个具有Express路由的节点应用程序。这些转发到AngularJS路由,有条件地加载单页首页应用程序的部分,或者如果没有会话则加载到登录页面。
我探索了使用AngularJS $locationProvider
从URL中删除哈希字符,以便我可以拥有更干净的地址。我查看了这个问题的答案中的模块调整:Removing the fragment identifier from AngularJS urls (# symbol)
执行此操作时,会干扰Express级别设置的路由。副作用是应用程序不再路由到登录页面。因此,以下Express侧逻辑被忽略:
app.get('/', function(req, res) {
if (req.session.user) {
res.render('index', { username : req.session.username, msg : req.session.msg });
}
else {
res.redirect('/login');
}
});
(/login
路径有自己的Express路线。)
换句话说,应用程序就像用户总是登录一样,因为AngularJS的$routerProvider
接管并显示(登录)首页:
function config($routeProvider) {
$routeProvider
.when('/', {
templateUrl : '/partials/front/front.html',
controller : 'FrontPageController',
controllerAs : 'vm'
})
...
.otherwise({redirectTo: '/'});
}
如果我必须保留散列网址,是否有办法处理Express路由,以便我可以获得散列后的内容?
例如,我有以下地址,Express加载为/
GET路由,然后在AngularJS端处理,以将viewer
特定部分加载到/
(前)页面:
https://foo.com/#/viewer?id=1234
我想要做的是转到Express路由并处理/
GET请求,以便我可以解析哈希后的内容并在登录后重定向。
基本上,我想要以下类型的逻辑:
app.get('/', function(req, res) {
if (req.session.user) {
res.render('index', { username : req.session.username, msg : req.session.msg });
}
else {
if (req.query.id) {
res.redirect('/login?t=viewer&id=' + req.query.id);
} else {
res.redirect('/login');
}
}
});
但在我有机会为重定向呼叫提取其值之前,看起来req.query.id
会被删除。
在快速删除之前有没有办法获取URL,以便我可以解析它?
如果没有这个,如果我删除片段标识符(哈希),有没有办法让AngularJS和Express路由一起玩得很好?