簡體   English   中英

Nodejs-登錄到前端時的用戶數據

[英]Nodejs - User Data on login to front-end

我已經構建了幾個其他expressjs應用程序,但是我找不到如何將用戶模型傳遞到前端或將其作為參數放入req中。

該應用程序是單頁Web應用程序,因此用戶使用登錄表單發布到/ 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; 它不會持續存在,並且當用戶重定向到“ /”時,req.user仍為空。 如何將該用戶信息保留在重定向頁面上?

如果我的理解是正確的,則res.redirect()調用實際上將導致瀏覽器重定向到給定的url,這將導致對您的快速服務器的新請求。 由於是新請求,因此舊的req對象不再相關。 我認為您想要的是使用快速會話中間件存儲登錄用戶的會話。 那里有很多很好的例子。這是一個

因此,解決方案是使用會話+中間件邏輯/功能。

這是設置(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”變量訪問用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM