Как найти и отредактировать сеанс с помощью express-session и connect-mongo? - PullRequest
0 голосов
/ 05 июня 2019

Я использую express-session и connect-mongo для работы с пользовательскими сессиями.

Мне нужно выяснить, как искать базу данных сессий для конкретногоПользователь и обновить его.

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

ОШИБКА:

Cast to ObjectId failed for value "reWCaAVbumSCW9P6g2qE705Cj6jz0qpD" at path "_id" for model "sessions"

КОД:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

const SessionSchema = new Schema({}, { strict: false });
const Session = mongoose.model('sessions', SessionSchema, 'sessions');

module.exports = function (userId, callback) {

    console.log('finding session for',userId);

    Session.findOne({session: {$regex: userId}},(err, session)=>{
        if (err) return callback(err);
        if (!session) return callback('user session not found');

        //parse session
        var sessionJson = JSON.parse(session['_doc'].session);

        //add reset flag
        sessionJson.passport.user.resetSession = true;

        //save back to document
        session['_doc'].session = JSON.stringify(sessionJson);

        //save session to database
        session.save((err, savedSession)=>{
            if (err) return callback(err);

            //success
            return callback(null);
        });
    });
};

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

1 Ответ

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

Были две проблемы с моей вышеупомянутой попыткой.

Сначала я должен был указать lean:true в параметрах findOne, что в итоге вернул идентификатор сеанса. Из-за этого я также должен использовать Session.findOneAndUpdate() вместо document.save().

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

new Schema({_id: String}, { strict: false });

После этого я смог обновить мои сеансы.

...