Проверка среды приложения внутри функции за пределами индексной страницы

#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! Сработало отлично. 🙂