При настройке sessionStore через MongoDB для express-session
у меня возникли небольшие проблемы с использованием функции findOne()
, чтобы убедиться, что информация пользователя действительна и в последнее время.Mongoose - Поиск схемы с помощью findOne() безуспешно
var session = require('express-session');
var mongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Session = mongoose.model('session', new Schema({
sid : String,
username : String,
email : String
}));
...
Хитрость заключается в том, однако, что express-session
и connect-mongo
несут ответственность за управление операциями записи в базе данных.
app.use(session({
secret: 'secretsquirrel',
resave: true,
saveUninitialized: true,
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName'
})
}));
Теперь это работает как следует, поскольку документы вводятся в указанную мной коллекцию. Возвращение данных из коллекции не приводит к следующему:
{
"_id":"sdBYsdflAsdfyWPPneV-hrC2xsXP",
"session":"
{
\"cookie\":
{
\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"
},
\"email\":\"[email protected]\",
\"username\":\"testuser\",
\"sid\":\"f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05\",
}",
"expires": ISODate(DateHere)
}
Где проблема, как представляется, что в базе данных, или через Mongoose, это, кажется, не имеет значения, как я пытаюсь запросить для SID, я возвращаю нет результаты, используя любой из следующих:
Via Монго:
db.collectionName.findOne({ session.sid: "sid" })
db.collectionName.findOne({ "session.sid": "sid" })
db.collectionName.findOne({ "session": { "\"sid\"": "sid" } })
Via Mongoose (NodeJS)
Session.findOne({ sid: req.session.sid }, function(err, data) {...});
Session.findOne({ "sid": req.session.sid }, function(err, data) {...});
Session.findOne({ "\"sid"\"": "\"" + req.session.sid + "\"" }, function(err, data) {...});
Столбец, как это происходит в обоих случаях, я не могу вернуть какие-либо данные, которые я проверил в коллекции? Нужно ли мне учитывать экранированные кавычки, возвращаемые в документе, как я пытался это сделать, или это просто вывод через оболочку mongo?
Есть ли какие-либо шаги, которые мне не хватает для правильного поиска этих данных? Свежий набор глаз будет очень благодарен!
Решение:
vinagreti отметил, что данные, записываемые в мои коллекции не были объекты, а открытый текст.
Обращаясь к connect-mongo's documentation, есть дополнительная опция для stringify
. Этот параметр строит и упорядочивает данные, сохраненные из сеанса, в базу данных. Учитывая, что express-session
уже создает объект JSON, использование stringify()
делает его неисследованным в коллекции.
Все, что было необходимо, чтобы добавить stringify: false
в настройки mongoStore так:
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName',
stringify: false
})
А потом вуаля! Все, что было сохранено в коллекции, теперь является объектом и доступно для поиска! Спасибо vinagreti за помощь в выявлении проблемы! Пожалуйста, поддержите его ответ!
Как я могу идти о сохранении объекта сеанса в качестве объекта? Может ли схема Mongoose не заботиться о сохранении так, или каждый элемент в объекте является открытым текстом? – Signus
Мангуста позаботится об этом для вас. Проверьте, передаете ли вы реальный объект в мангуст. Может быть, вы передаете строку. Попробуйте использовать JSON.parse (jsonString); для переключения строки сеанса в объект перед сохранением. – vinagreti
Ну, элементы схемы являются строками, однако трюк заключается в том, что 'express-session' и' connect-mongo' вместе отвечают за запись схемы в базу данных. – Signus