Проблема с настройкой MongoDB / Monk / Express-Sessions ("не может сериализовать пользователя")
Я пытаюсь настроить свою первую систему аутентификации Mongo, и она идет довольно хорошо до того момента, когда я пытаюсь создать сеанс для пользователя с помощью экспресс-сеансов.
Мои пользовательские маршруты в порядке - я могу зарегистрироваться и войти в систему, и это отражено в базе данных - но как только я перехожу к этапу создания сеанса, я получаю ошибку "Не удалось сериализовать пользователя в сеанс".
Я подозреваю, что ошибка в том, как я настроил мои сеансы:
//var MongoStore = require('connect-mongostore')(session);
app.use(session({
//store: new MongoStore({ db: 'callcongress', url: 'mongodb://localhost:27017/callcongress', collections: ['usercollection', 'sessions']}),
secret: process.env.SECRET_KEY,
resave: false,
saveUninitialized: true,
}));
store
а также MongoStore
строки закомментированы на данный момент.... их наличие приводит к следующему (изменения по мере обновления страницы):
- Сервер зависает и не отвечает
Error getting collection: sessions <Error: Error setting TTL index on collection : sessions <Error: Error setting TTL index on collection : sessions <Error: Cannot determine state of server>>>
Cannot determine state of server
(Я пытался найти эту ошибку, но все остальные вопросы, которые у нее были, были о развертывании героку?)
Я попробовал MongoStore
с кучей разных наборов опций, каждый из которых имел одинаковый результат.
Вот что происходит в терминале при входе в систему (результат консоли console.logs):
{ _id: 58ab42c1f0a05388ce3b2348,
username: 'test16',
name: 'test',
password: '$2a$10$i6sip04Jw6ylk83aOfnXIui7dszBIbe0OEdLSNVsRHQe8Xquy1r7O',
email: 'test@test.com',
district: 'New York 5th' }
got it
POST /auth/login 500 115.327 ms - 1003
А вот как выглядят мои методы сериализации / десериализации:
const passport = require('passport');
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/callcongress');
const userCollection = db.get('usercollection');
module.exports = () => {
var user_cache = {};
passport.serializeUser(function(user, next) {
console.log('in serialize');
let id = user._id;
user_cache[id] = user;
done(null, id);
});
passport.deserializeUser((id, done) => {
console.log('in deserialize 1');
userCollection.findById(id)
.then((user) => {done(null, user_cache[id]);})
.catch((err) => {done(err, null);});
});
};
Ни один из консольных журналов здесь ничего не выводит, что также как-то меня удивляет. Однако тот, что в конце моей местной стратегии, работает.
Я немного посмотрел на Mongoose и предпочел бы не использовать его на этом этапе - я достаточно борюсь с концепцией MongoDB, не добавляя еще одну вещь в микс. Любое понимание будет оценено.
1 ответ
Похоже, что сериализация пользователей в экспресс-сессиях не работает без модели. Я закончил тем, что использовал Mongoose.