Проблема с настройкой 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.

Другие вопросы по тегам