Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 在node.js应用程序中,我如何在过滤之前异步实现rails控制器的效果?_Asynchronous_Node.js_Before Filter - Fatal编程技术网

Asynchronous 在node.js应用程序中,我如何在过滤之前异步实现rails控制器的效果?

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

我有一个node.js Express应用程序,它有一个基本的用户身份验证系统,会话存储在redis中。我想编写并重用一个current_user()函数,该函数在当前_user变量中填充登录用户(如果有)的JSON表示形式。以下是检索用户的代码:

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过滤器的问题,但您的答案更适用于我的用例,我将使用这个。再次感谢。