Asynchronous 在node.js应用程序中,我如何在过滤之前异步实现rails控制器的效果?
我有一个node.js Express应用程序,它有一个基本的用户身份验证系统,会话存储在redis中。我想编写并重用一个current_user()函数,该函数在当前_user变量中填充登录用户(如果有)的JSON表示形式。以下是检索用户的代码:Asynchronous 在node.js应用程序中,我如何在过滤之前异步实现rails控制器的效果?,asynchronous,node.js,before-filter,Asynchronous,Node.js,Before Filter,我有一个node.js Express应用程序,它有一个基本的用户身份验证系统,会话存储在redis中。我想编写并重用一个current_user()函数,该函数在当前_user变量中填充登录用户(如果有)的JSON表示形式。以下是检索用户的代码: if( req.cookie('fingerprint') ) { redis_client.get("users:fingerprint:"+req.cookie("fingerprint"), function(err,id) { r
if( req.cookie('fingerprint') ) {
redis_client.get("users:fingerprint:"+req.cookie("fingerprint"), function(err,id) {
redis_client.get("users:id:"+id, function(err,user) {
current_user = JSON.parse(user);
})
})
}
如果我只想使用一次,我可以在current\u user
行之后放置一个res.render
调用,但我想为所有控制器和操作填充current\u user变量
我不熟悉node,所以这里可能缺少一个基本概念……但基本上,我需要一种方法在同步上下文中从上面返回当前用户变量,或者异步实现相同的效果。比如说,
app.get('/', function(req,res) {
current_user = current_user();
res.render('home', {layout: "layout.ejs", locals: {current_user: current_user}})
})
谢谢。快速路线接受第三个参数:
next
,这允许您将控制权传递给下一条匹配的路线。您可以使用此选项基于路由在筛选器之前建立,如:
app.get('/admin', function(req, res, next){
if(authenticated_user()) {
req.user = get_user();
next();
}
else // prompt for login
});
app.get('/admin/:id', function(req, res){
// foo
}
希望这有帮助,有关更多信息,请参阅中的
使现代化
用烘干机的方法达到同样的效果哦,好酷
你为什么不直接用炸药呢 首先,将当前用户存储在会话中。由于您正在使用redis,请查看类似connect redis for express的内容。然后将其存储在会话中,如下所示:
if( req.cookie('fingerprint') ) {
redis_client.get("users:fingerprint:"+req.cookie("fingerprint"), function(err,id) {
redis_client.get("users:id:"+id, function(err,user) {
req.session.user = JSON.parse(user);
})
})
}
req.session.regenerate(function() {
// same as above!
req.session.user = JSON.parse(user);
});
将其作为dynamicHelper提供:
app.dynamicHelpers({
current_user: function(req) {
return req.session.user;
}
});
现在,您的所有路由处理程序以及视图都可以使用当前用户
app.get('/admin/:id', function(req, res){
if(current_user) {
//do what you want here...
}
});
登录时,只需重新生成会话,如下所示:
if( req.cookie('fingerprint') ) {
redis_client.get("users:fingerprint:"+req.cookie("fingerprint"), function(err,id) {
redis_client.get("users:id:"+id, function(err,user) {
req.session.user = JSON.parse(user);
})
})
}
req.session.regenerate(function() {
// same as above!
req.session.user = JSON.parse(user);
});
注销时,销毁会话:
req.session.destroy(function() {
res.redirect('/');
});
是的,这正是我想要的!RTFM我猜:-/谢谢Daniela也很高兴知道,谢谢Shripad!我将Daniel的答案标记为正确,因为它更直接地回答了创建before过滤器的问题,但您的答案更适用于我的用例,我将使用这个。再次感谢。