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