我想编写一个辅助函数 isLoggedIn ,用于判断任何用户是否已登录,如果已登录,请设置res.locals.is_logged_in = true。
var isLoggedIn = function(req, res, next) {
User.findById(sessions.user_id, function(err, user) {
if (err) throw err;
return !user ? false : true;
});
};
然后,在所有路线之前,我写
.use(express.static(path.join(__dirname, '/public')))
.use(express.static(path.join(__dirname, '/bower_components')))
.use(flash)
.use(function(req, res, next) {
if (isLoggedIn(req, res, next)) {
res.locals.is_logged_in = true;
res.locals.current_user = '/users/' + req.user._id;
} else {
res.locals.is_logged_in = false;
}
res.locals.showTests = app.get('env') !== 'production' &&
req.query.test === '1';
next();
});
var routes = require('./routes/routes.js');
app.use('/', routes.staticPages());
app.use('/', routes.sessions(sessionHelper));
app.use('/users', routes.users(sessionHelper));
但我意识到 findById 是一个异步函数,因此我无法以这种方式获得正确的行为。
我试过
var isLoggedIn = function(callback) {
User.findById(sessions.user_id, function(err, user) {
if (err) throw err;
callback(user);
});
};
.use(function(req, res, next) {
sessionHelper.isLoggedIn(function(user) {
if (!user) {
console.log("no");
res.locals.is_logged_in = false;
} else {
console.log("yes");
res.locals.is_logged_in = true;
res.locals.current_user = '/users/' + req.user._id;
}
});
res.locals.showTests = app.get('env') !== 'production' &&
req.query.test === '1';
next();
});
它也无法正常工作:在某些路线中,我打印 res.locals.is_logged_in ,获取值" undefined" ,如何解决这个问题?
答案 0 :(得分:1)
你需要异步调用。在您的情况下,您应该使用回调:
.use(function(req, res, next) {
sessionHelper.isLoggedIn(function(user) {
if (!user) {
console.log("no");
res.locals.is_logged_in = false;
} else {
console.log("yes");
res.locals.is_logged_in = true;
res.locals.current_user = '/users/' + req.user._id;
}
next(); // next MUST be here in order to continue AFTER db query
});
res.locals.showTests = app.get('env') !== 'production' &&
req.query.test === '1';
//next(); // remove this from here, as it makes it continue without waiting for db query
});