2016-06-25 3 views
0

My MongoDB имеет коллекцию sessions, которая создается модулем. У коллекции нет модели или ничего, поскольку она не создана Mongoose.Mongoose удалить из коллекции без модели

Как я могу получить доступ к этой коллекции без указания ее модели?

Я попытался следующие:

mongoose.connection.db.sessions.remove({'session.userId': userId}, function(e, found) { 
    console.log(found); 
    res.json({success: true}); 
}); 

Хотя я получил ошибку: Cannot read property 'remove' of undefined

+0

Возможный дубликат http://stackoverflow.com/a/10519504/3284355 см. Редактирование правильного ответа. Вы можете использовать собственный пакет драйверов mongo, поскольку он уже установлен. – Molda

ответ

1

Запрос коллекции непосредственно будет решать только часть проблемы.

С учетом этого вы используете express-session и connect-mongo для управления сеансами. Это будет хранить данные сессии (req.session) как JSON строку в базе данных:

{ 
    "_id": "fLBj_McMFM-7PwVNsv9ov88vOAgoNiDa", 
    "session": "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"userId\":\"my-user-id\"}", 
    "expires": ISODate("2016-07-09T08:47:38.156Z") 
} 

Как вы можете видеть, session является строка, а не объект, поэтому вы не можете запросить его непосредственно с помощью session.userId ,

Если вы не можете использовать req.session.destroy(), вам необходимо выполнить регулярный запрос выражение в соответствии с пользовательским идентификатором в строке JSON:

let collection = mongoose.connection.db.collection('sessions'); 
let query  = new RegExp(`"userId":"${userId}"`); 
collection.remove({ session : query }, function(e, found) { 
    console.log(found); 
    res.json({success: true}); 
}); 

Это, вероятно, лучше всего, если userId это первый запуск через что-то вроде escape-string-regexp чтобы убедиться, что любые специальные символы экранированы надлежащим образом.

Обратите внимание, что это не быстрый запрос, особенно если у вас много сеансов в вашей базе данных.

EDIT: Я только что нашел вариант stringify для connect-mongo, который, если установлен в false, следует записать данные сессии в качестве обычного объекта MongoDB, а не в виде строки JSON.

+0

Вы предположения верны. Я использую 'express-session' с' connect-mongo' для управления моими сеансами. В 'POST' для моего API выхода мне нужно уничтожить эти сеансы. Мне удалось это сделать, вызвав 'req.session = null' внутри моего API и установив' unset: 'destroy'' в настройках сеанса. Хотя есть одна небольшая проблема; моя домашняя страница ('app.get ('/', ...)') служит для другой страницы, если 'req.session.userId' не является неопределенным. По какой-то причине мне нужно обновить мою страницу дважды после вызова API выхода, чтобы он был отключен. – Fizzix

+0

@Fizzix вы можете проверить в базе данных, если сеанс, принадлежащий к ключу сеанса, был удален после запроса на маршрут выхода из системы? Или, может быть, 'req.session.destroy()' работает лучше? – robertklep

Смежные вопросы