req.user не определен, но вход в систему работает нормально - PullRequest
0 голосов
/ 06 июня 2019

Справочная информация

Я понимаю, что этот вопрос задавался миллион раз, но ни один из указанных вопросов никогда не решал мою проблему.В маршрутах моих приложений вызов req.user только когда-либо возвращает неопределенный, независимо от того, к какому маршруту я обращаюсь.

Моя функция входа также работает нормально, если это помогает.У меня есть определенные элементы изменения моего клиента при входе в систему / без нее, но req.user возвращает undefined независимо от этого.

Как многие указывали на подобные вопросы, это, вероятно, ошибка в упорядочении моего промежуточного программного обеспечения,но я не могу найти его, потому что мой порядок практически копируется / вставляется из ~ 3 разных мест.

Общий макет моего приложения - это один основной файл, app.js, который устанавливаетдо моего экспресс-приложения и содержит все мои маршруты.Все мои маршруты находятся под настройками промежуточного программного обеспечения. Соответствующий app.js код

// Middleware
// Setup DB Pool and app
var pool = mysql.createPool(db.pool);
var app  = express();

// Setup Handlebars
app.engine('handlebars', exprhbr({defaultLayout: 'index'}));
app.set('view engine', 'handlebars');
app.use(express.static('public'));

// Setup body parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Setup session
app.use(session({
    cookie: { maxAge: 60000 },
    secret: 'spooky',
    resave: true,
    saveUninitialized: true
}));

// Setup passport
app.use(passport.initialize());
app.use(passport.session());

...

// An example route
app.get('/', (req, res) => {
    let loggedIn = req.isAuthenticated(); // works perfectly
    console.log('user: ', req.user); // always prints "user: undefined"

    res.status(200).render('home', {
        page:     'Home',
        noSearch: true,
        loggedIn: loggedIn,
        user:     req.body.username
    });
});

// My login route
app.post('/login', (req, res, next) => {
    if (verify.login(req.body)) {
        passport.authenticate('local', {
            session: true,
            successRedirect: '/user/' + req.body.username,
            failureRedirect: '/login'
        })(req, res, next);
    }
});

Паспорт

Я инициализирую паспорт, используя:

require('./src/passport')(passport);

вверху моего файла, и указанный файл паспорта выглядит следующим образом: Соответствующий код passport.js

var strategy = require('passport-local').Strategy;
var bcrypt   = require('bcrypt');
var mysql    = require('mysql');
var db       = require('./database');
var pool     = mysql.createPool(db.pool);

module.exports = (passport) => {
    passport.serializeUser((user, done) => {
        done(null, user.uid);
    });

    passport.deserializeUser((uid, done) => {
        pool.query('SELECT * FROM User WHERE (user_id = ?)', [uid], (err, result) => {
            done(err, {uid: result[0].user_id, username: result[0].username, pass: result[0].password});
        });
    });

    // Setup Passport
    passport.use(new strategy({ usernameField: 'username' }, (username, pass, done) => {
        // Match a user
        pool.query('SELECT * FROM User Where (username = ?)', [username], (err, result) => {
            if (!result.length) return done(null, false, {message: 'Username isn\'t registered'});
            let user = result[0];

            // User was found so decrpt pass
            bcrypt.compare(pass, user.password, (err, isMatch) => {
                if (err) throw err;

                // User matches
                if (isMatch)
                    return done(null, {uid: user.user_id, username: username, pass: user.password});
                else
                    done(null, false, {message: 'Password doesn\'t match'})
            });
        });
    }));
}

Смена порядка объявлений моих функций ничего не даст, если это вообще поможет.

Спасибо, что нашли время прочитать этот длинный пост и, возможно, помогли мне!

1 Ответ

0 голосов
/ 06 июня 2019

В настоящее время мой сайт регистрирует вас после нескольких обновлений страницы, и большую часть времени я не замечаю этого.

Моя проблема возникла из-за того, что я проверял req.user для пользователя, который не вошел в систему, поэтому единственная логическая вещь, которую он должен был вернуть, была неопределенной. Поскольку я не заметил, что я вышел из системы, я предположил, что он напечатан как неопределенный независимо от того, вошел ли пользователь в систему.

Я исправил эту проблему, сначала подтвердив существование вошедшего в систему пользователя, проверив, существует ли req.user, и затем установив соответствующие переменные.

...