Node.js 如何使用Express和MongoStore从MongoDB集合中查找会话
我正在使用Node/Express/Mongo实现一个会话存储。我的问题是,我无法从我的Node.js 如何使用Express和MongoStore从MongoDB集合中查找会话,node.js,mongodb,session,Node.js,Mongodb,Session,我正在使用Node/Express/Mongo实现一个会话存储。我的问题是,我无法从我的sessions集合中检索任何会话,因此我无法确定用户是否已登录 我正在使用MongoSkin、MongoStore和MongoConnect,尽管我不介意使用Mongoose和其他工具 以下是我的调试输出: // Check whether the current user has a session. // If so, adds "currentUser" to the request. // Else
sessions
集合中检索任何会话,因此我无法确定用户是否已登录
我正在使用MongoSkin、MongoStore和MongoConnect,尽管我不介意使用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”:/},函数(err,user){
给我一个输出,所以我认为问题在于将记录与会话字段字符串中的字段相匹配。上面数据库输出中显示的session
字段有问题,因为它是一个长字符串,而不是嵌套的JSON
此外,我的会话
记录在添加到我的app.js
后会自动插入:
app.use(expressSession({
secret: 's3cretc0de',
store: new MongoStore({
url: mongoUrl
}, function () {
console.log("db session connection open");
})
}));
我在路由器中添加了令牌
和用户名
字段,如下所示:
router.get('/verify', function(req, res) {
req.session.username = username;
req.session.token = req.query.token;
}
我遗漏了什么吗?如果您能提供任何帮助,我们将不胜感激。当您使用MongoStore存储会话数据时,您不需要直接查询MongoDB。该模块为您提供一切 您可以使用
req.session
获取会话数据
因此,在您的路线中,您可以执行以下操作:
app.get('/', function(req, res){
// check if the username is set in the session
if (!req.session.username) {
// redirect it to login page
res.redirect('/login');
} else {
// do something
}
});
app.post('/login', function(req, res) {
// you would check check the username & password here
// if (username == '...' /&& password ...)
// set the username in the session session
req.session.username = username;
});
就是这样,谢谢。我只是好奇,因为我认为MongoSkin是MongoDB的包装器:MongoSkin也处理游标吗?MongoSkin中游标的适当处理方式是在回调之前将结果转换为数组吗?例如,如果我需要许多记录,我会使用:
db.collection('myCollection')。find({“key”):req.session.someValue},).toArray(函数(err,items){
?@Lucas MongoSkin实际上包装了一些常用函数并返回承诺(以避免回调地狱)。如果您使用MongoSkin,您可以这样使用它来处理多个项。示例中的toArray
方法实际上是在光标上调用的(实际上是SkinCursor对象)。我刚刚意识到这个答案不起作用。我在我的会话
集合中有其他记录与{“\u id”:req.session.\u id}
谓词一致。我还尝试了你的原始答案,{“session.\u id”:req.session.\u id}
但它也不起作用。当我使用谓词{“\u id”:/}
或{“session”:/}
,我总是得到一个匹配项。我想这是因为会话
字段不是嵌套的JSON,而是一个文本字符串。你有什么建议吗?有没有办法为会话
字段内的字段进行选择?很抱歉造成混淆。@ChristianP如果我们需要所有会话的列表并删除/销毁一个特定的会话,你如何选择我们用MongoStore做的