在通过MongoDB为express-session
设置会话存储时,我在使用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\":\"testuser@email.com\",
\"username\":\"testuser\",
\"sid\":\"f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05\",
}",
"expires": ISODate(DateHere)
}
如果问题出现在数据库中,或者通过Mongoose,我似乎无法解决查询SID的问题,我使用以下任何一项都不会返回任何结果:
通过Mongo:
db.collectionName.findOne({ session.sid: "sid" })
db.collectionName.findOne({ "session.sid": "sid" })
db.collectionName.findOne({ "session": { "\"sid\"": "sid" } })
通过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) {...});
stumper是,在这两种情况下,我都无法返回我已验证的任何数据集合中的数据?我是否需要考虑文档中返回的转义引号,或者只是通过mongo shell输出?
我是否缺少正确搜索此数据的步骤?一双新鲜的眼睛将非常感激!
解决方案:
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 帮助指出问题所在!请提出他的回答!
答案 0 :(得分:3)
您将会话对象保存为纯文本。因为你不能搜索对象。
确保"父亲"的架构集合将会话字段作为类型' {}' (对象)喜欢:父亲= {会话:{类型:{} }}
如果不起作用,您可以尝试下面的内容:
您可以更改保存会话对象的方式,将其另存为对象,而不是纯文本。
或者,您可以使用正则表达式搜索会话,尝试在会话字段中找到 sid ,如:
db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/});