Справочная информация
Я понимаю, что этот вопрос задавался миллион раз, но ни один из указанных вопросов никогда не решал мою проблему.В маршрутах моих приложений вызов 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'})
});
});
}));
}
Смена порядка объявлений моих функций ничего не даст, если это вообще поможет.
Спасибо, что нашли время прочитать этот длинный пост и, возможно, помогли мне!