#node.js
#node.js
Вопрос:
Я использую Node.js модуль passport (локальная стратегия) и в моем методе isLoggedIn я хочу проверить, использую ли я среду разработки. Если да, то я хочу просто войти в систему с учетной записью администратора, если нет, то она должна перенаправить на страницу входа, где обычный пользователь будет входить в систему как обычно.
Причина этого в том, что во время разработки мне приходится повторно входить в систему снова и снова каждый раз, когда я вношу изменения в код, что действительно отнимает много времени.
Вот мой код (некоторые части удалены для наглядности)
index.js
require('./app/routes.js')(app, passport);
app/routes.js
module.exports = function(app, passport) {
app.post('/search', isLoggedIn, function(req, res) {
// redirect to search page etc...
});
}
function isLoggedIn(req, res, next) {
// I want to check here if I'm it's the development environment and not production
// If it's development, then it should perform a database lookup and look up the
// admin user's account, otherwise it should carry on and use the isAuthenticated
// method below.
// I wanted to use app.get('env') but "app" isn't available here..
// if user is authenticated in the session, carry on
if (req.isAuthenticated())
return next();
// if they aren't redirect them to the home page
res.redirect('/login');
}
config/passport.js
passport.use('local-login', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ 'local.email' : email }, function(err, user) {
// if there are any errors, return the error before anything else
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'No user found with username '' email ''')); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
// all is well, return successful user
return done(null, user);
});
}));
Ответ №1:
Переместите isLoggedIn
функцию в module.exports
определение. После этого функция получит доступ к app
объекту с ограниченной областью действия и isLoggedIn
останется «закрытой» для внешнего потребителя (поскольку она ничего не возвращает).
module.exports = function(app, passport) {
app.post('/search', isLoggedIn, function(req, res) {
// redirect to search page etc...
});
function isLoggedIn(req, res, next) {
app.get('env');
// ...
}
};
Комментарии:
1. Спасибо @dylants! Сработало отлично. 🙂