2015-06-12 3 views
1

При настройке 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 за помощь в выявлении проблемы! Пожалуйста, поддержите его ответ!

ответ

3

Вы являетесь , сохраняя свой объект сеанса как обычный текст. из-за этого вы не можете искать как объект.

Убедитесь, что схема "отца" коллекции есть поле сеанса как тип '{}' (Object), как: Отец = {сессии: {типа: {}}}

Если это не работа, вы можете попробовать следующее:

Вы можете изменить способ сохранения объекта сеанса, , сохраняя его как объект, а не как обычный текст.

Или, вы можете искать сеанс с регулярным выражением, пытаясь найти SID на поле сеанса, как:

db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/}); 
+0

Как я могу идти о сохранении объекта сеанса в качестве объекта? Может ли схема Mongoose не заботиться о сохранении так, или каждый элемент в объекте является открытым текстом? – Signus

+0

Мангуста позаботится об этом для вас. Проверьте, передаете ли вы реальный объект в мангуст. Может быть, вы передаете строку. Попробуйте использовать JSON.parse (jsonString); для переключения строки сеанса в объект перед сохранением. – vinagreti

+0

Ну, элементы схемы являются строками, однако трюк заключается в том, что 'express-session' и' connect-mongo' вместе отвечают за запись схемы в базу данных. – Signus

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