2014-08-28 58 views
1

我有一个基于node.js,express,angular(with routes)和mongo的web应用程序。身份验证通过Passport.js进行处理。Express res.render不适用于Angular路由

我的角度视图通过http请求与服务器交互。说我送类型的请求:

$http.get('/api/getMyData').success(function(data) {})... 
我在服务器上

app.get('/api/getMyData',function(req, res) { 
    if(!req.user){ 
    // if the session expired 
    res.render('login.ejs',{message:'Session expired. Please login again.'}); 

有了这个代码,我希望用户被重定向到登录页面,如果会话已过期。

现在,这是行不通的,我没有重定向登录。即使我有console.log(req.user)生产undefinedreq.user==undefined给予trueif内的res.render不起作用。如果我尝试res.redirect('login'); 我得到一个404错误,说/api/login不存在。

我真的很迷茫,任何帮助将不胜感激。

+0

你是不是指res.render? (您的标题) – 2014-08-28 20:21:29

+0

标题编辑,谢谢。 – ZzKr 2014-08-28 22:26:44

回答

0

我实现了类似于@Jordonias建议的东西。 我从服务器获取用户(如果会话过期,则为null), 以及如果用户为null我使用$window.location.href="/login";来注销用户。 感谢@Jordonias。更好的选择是值得欢迎

2

您的$http.get()res.render()返回内容。 您可以通过在$http.get().success() 中添加console.log(data);来查看此信息。如果从api发生错误,您需要向客户端添加一些逻辑以重定向。

喜欢的东西:

server.js

app.get('/api/getMyData', function(req, res) { 
    if(!req.user) { 
    res.status(401); 
    return res.json({ 
     status: 'error', 
     message: 'Unauthorized' 
    }); 
    } 
    return res.json({ 
    status: 'success', 
    // Stuff 
    }); 
} 

$http.get('/api/getMyData').success(function(data) { 
    // Do something 
}).error(function(data, status) { 
    // Handle the error 
}); 

注:这是未经测试,但它会给你一个总体思路。可能有更优雅的解决方案。

+0

感谢您的评论。我看到这可能是一个解决方案。 假设我得到一个带有status:error的json,那么我怎么才能从angular重定向到像login.ejs这样的登录页面,并带有特定的消息(我想在原始帖子中如果想这么做)? 在任何情况下,我仍然不明白为什么res.render在这种情况下不起作用。 – ZzKr 2014-08-28 22:30:26

+0

为** login.ejs **(/ login)创建一个路由并执行诸如'$ location.path(url);'then'$ scope。$ apply();' – Jordonias 2014-08-29 15:09:21