我已经构建了其他几个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仍为空。如何将此用户信息保留在重定向页面?
答案 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”变量访问用户。