Nodejs - 登录前端的用户数据

时间:2015-09-14 18:04:02

标签: node.js model-view-controller express login

我已经构建了其他几个expressjs应用程序,但我无法找到如何将用户模型传递给前端或将其作为参数放入req中。

该应用是一个单页的网络应用,因此用户使用登录表单发布到/ login:

app.post('/login', require('./app/controllers/user').login);

控制器选择它并调用特定模块以处理请求:

exports.login = function (req,res) {
  AccountHandler.login(req,function (response) {
    if (response.code < 0) {
      req.flash('error', response.msg);
    }
    else if (response.code > 0) {
      req.flash('success', response.msg);
    }
    req.user = response.user;
    res.redirect(response.url);
  });
}

这是处理登录并通过传递所需参数调用回调的模块:

exports.login = function (req,callback) {
  process.nextTick(function () {
      User.findOne({ 'valid.email': req.body.Email }, function (err, user) {
          if (err) {
            callback({url: '/#login', msg: "There was an unexpected error!", code: -10});
          }
          if (!user) {
            callback({url: '/#login', msg: "No such email/password combination was found", code: -1});
          }
          if (user) {
            easyPbkdf2.verify(user.valid.salt, user.valid.password, req.body.Password, function (err, valid) {
              if (!valid){
                callback({url: '/#login', msg: "No such email/password combination was found", code: -1});
              }
              else{
                callback({user: user, url: '/', msg: "acknowledged", code: 10});
              }
            });
          }
      });
  });
}

在控制器中,我说req.user = response.user;并不存在,并且用户被重定向到&#39; /&#39; req.user仍为空。如何将此用户信息保留在重定向页面?

2 个答案:

答案 0 :(得分:0)

如果我的理解是正确的,res.redirect()调用实际上会导致 浏览器重定向到给定的URL,这将导致新的请求 你的快递服务器。由于它是一个新请求,旧的req对象不再存在 相关。 我想你想要的是使用快速会话中间件存储登录用户的会话。那里有很多很好的例子..这是one

答案 1 :(得分:0)

因此,解决方案是使用会话+中间件逻辑/功能。

这是设置(exrepssjs):

使用快速会话模块:

var sessionMiddleware = session({
  resave: true,
  saveUninitialized: true,
  httpOnly: true,
  genid: function(req) {
     return uuid.v1() // I used another module to create a uuid
  },
  secret: 'random secret here',
  cookieName: 'session', // if you dont name it here it defaults to connectsid
});

在创建中间件之后,以便按如下方式处理每个请求的会话(简化,我对用户超时进行查找并将其传递回前端):

app.use(function(req, res, next) {
  res.locals.success_messages = req.flash('success_messages');
  res.locals.error_messages = req.flash('error_messages');

  if (req.session && req.session.user) {
    User.findOne({ email: req.session.user.email }, function(err, user) {
      if (user) {
        req.user = user;
        delete req.user.password; // delete the password from the session
        req.session.user = user;  //refresh the session value
        res.locals.user = user;
      }
      // finishing processing the middleware and run the route
      next();
    });
  } else {
    next();
  }
});

现在大部分时间使用ejs或jade从前端开始,您可以使用“user”变量访问用户。