【发布时间】:2014-08-18 05:48:10
【问题描述】:
我正在使用 Node/Express/Mongo 实现会话存储。我的问题是我无法从我的sessions 集合中检索任何会话,因此我无法确定用户是否已经登录。
我正在使用 MongoSkin、MongoStore 和 mongo-connect,尽管我不介意使用 Mongoose 和其他工具。
这是我的调试输出:
// Check whether the current user has a session.
// If so, adds "currentUser" to the request.
// Else, redirect to the login page.
function loadUser(req, res, next) {
console.log("loadUser: checking loadUser...");
var db = req.db;
console.log("current req.session.token:");
console.log(req.session.token);
console.log("current req.session:");
console.log(req.session);
if (req.session.token) {
// Look up the session id in the database 'sessions' collection.
db.collection('sessions').findOne({token : req.session.token}, function(err, user) {
console.log("found user by looking up token:");
console.log(user);
if (user) {
req.currentUser = user;
next();
} else {
console.log("token not in 'sessions', redirecting...");
res.redirect('/login/webapp_login.html');
}
});
} else {
console.log("no token, redirecting...");
res.redirect('/login/webapp_login.html');
}
}
这是控制台输出:
loadUser: checking loadUser...
current req.session._id:
53acb8e1b7b297dc29681def
current req.session:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
isLogged: 21,
username: 'sessiontest1',
token: '57a6dfe0bea9150bd4e2d1f76974e88b',
}
found user by looking up token:
null
token not in 'sessions', redirecting...
伴随:
db.collection('sessions').find(req.session._id, function(user) {
我也试过了:
db.collection('sessions').findOne({session:{token:req.session.token}}, function(err, user) {
但我仍然得到null 并且函数重定向。我错过了什么吗?任何的意见都将会有帮助。我正在使用 MongoSkin,尽管我也对 Mongoose 中的解决方案持开放态度。
另外,我知道我的数据库配置正确,因为我检查了命令行:
> db.sessions.find().pretty()
{
"_id" : "vnftBGNFVQ3S4lHiIB_omOxWDu01kFuH",
"session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":t
rue,\"path\":\"/\"},\"isLogged\":6}",
"expires" : ISODate("2014-07-09T03:44:54.863Z")
}
{
"_id" : "-AMKc_kIzOOAn_eQJ6RJpvTgWoargLaJ",
"session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":t
rue,\"path\":\"/\"},\"isLogged\":20,\"username\":\"sessiontest1\",\"token\":\"57a6dfe0bea
9150bd4e2d1f76974e88b\"}",
"expires" : ISODate("2014-07-11T06:35:14.835Z")
}
出了什么问题,为什么我无法从我的 sessions 集合中检索会话?
更新 运行
db.collection('sessions').find({"session" : /./}, function(err, user) {
给了我一个输出,所以我认为问题在于将记录与会话字段字符串中的字段匹配。上面数据库输出中显示的 session 字段存在问题,因为它是一个长字符串,而不是嵌套的 JSON。
另外,我的sessions 记录在添加到我的app.js 后会自动插入:
app.use(expressSession({
secret: 's3cretc0de',
store: new MongoStore({
url: mongoUrl
}, function () {
console.log("db session connection open");
})
}));
我在路由器中添加了token 和username 字段,如下所示:
router.get('/verify', function(req, res) {
req.session.username = username;
req.session.token = req.query.token;
}
我错过了什么吗?任何帮助将不胜感激。
【问题讨论】: