Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Express和MongoStore从MongoDB集合中查找会话_Node.js_Mongodb_Session - Fatal编程技术网

Node.js 如何使用Express和MongoStore从MongoDB集合中查找会话

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

我正在使用Node/Express/Mongo实现一个会话存储。我的问题是,我无法从我的
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做的