Node.js 尝试在另一个路由上访问时,req.session内容将被取消

Node.js 尝试在另一个路由上访问时,req.session内容将被取消,node.js,session,express,Node.js,Session,Express,我无法理解使用expressjs会话的代码有什么问题 我正在路由/login上设置req.session.is_logged=true,然后按F5调用路由/session,并且req.session.is_logged的值为false 这里有一些代码 var express = require("express"); var app = express(); app.configure(function(){ app.use(express.bodyParser()); app

我无法理解使用expressjs会话的代码有什么问题

我正在路由
/login
上设置
req.session.is_logged=true,然后按F5调用路由
/session
,并且
req.session.is_logged
的值为false

这里有一些代码

var express = require("express");
var app = express();

app.configure(function(){
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({secret: 'test', store: express.session.MemoryStore({
        reapInterval: 60000 * 10
    })}));
});

app.get('/session', function(req, res){
        if (req.session.is_logged){
            console.log('|-->Session recognized');
            res.status(200);
            res.send({ response: "OK" });
        }else{
            console.log('|-->Any session recognized');
            res.status(403);
            res.send({ response: "KO" })
        };
});

app.get('/login', function(req, res){
    req.session.is_logged = true;
    res.status(200);
    res.send({ response: "OK" });       
});

app.listen(3000);
我看到了一些类似的方法来做它,它似乎工作。。。谢谢你的帮助


Express v3.0.5

您正在/login路由上设置req.session.is_logged=false,那么它怎么可能是真的

为会话使用内存存储的更好方法是

var MemoryStore = express.session.MemoryStore
,store = new MemoryStore();
app.use(express.session({ secret: 'something', store: store }));

您正在/登录路由上设置req.session.is_logged=false,那么它怎么可能是真的呢

为会话使用内存存储的更好方法是

var MemoryStore = express.session.MemoryStore
,store = new MemoryStore();
app.use(express.session({ secret: 'something', store: store }));

问题是您没有使用登录路径发送响应,因此客户端不知道如何设置cookie。解决方法是简单地发送任何响应:

app.get('/login', function(req, res){
    req.session.is_logged = true;            
    res.send('Ok!'); /* Now the 'Set-Cookie' HTTP header will be sent to the client. */
});
并确保将
MemoryStore
对象作为
express.session
的属性正确引用,因为它不是全局对象:

app.use(express.session({secret: 'test', store: express.session.MemoryStore({
    reapInterval: 60000 * 10
})}));

问题是您没有使用登录路径发送响应,因此客户端不知道如何设置cookie。解决方法是简单地发送任何响应:

app.get('/login', function(req, res){
    req.session.is_logged = true;            
    res.send('Ok!'); /* Now the 'Set-Cookie' HTTP header will be sent to the client. */
});
并确保将
MemoryStore
对象作为
express.session
的属性正确引用,因为它不是全局对象:

app.use(express.session({secret: 'test', store: express.session.MemoryStore({
    reapInterval: 60000 * 10
})}));

您可能不尊重这一点,会话系统不支持CORS

您的代码没有错,但是如果您访问URL
mydomain.com
并访问
mydomain.com:3000
上的节点服务器,它将无法工作


有很多方法可以让它工作(Apache proxy reverse,NGINX…),进行一些研究,并根据您的情况选择最合适的方法。

您可能不尊重这些方法,会话系统不支持CORS

您的代码没有错,但是如果您访问URL
mydomain.com
并访问
mydomain.com:3000
上的节点服务器,它将无法工作


有很多方法可以让它工作(Apache proxy reverse,NGINX…),做一些研究,并根据您的情况选择最合适的方法。

您的
/login
路由集
req.session.is_logged=false
是的,我在这里写了一个代码示例,但它不在我的本地机器上,很抱歉,我已经更新了代码。您的
/login
路由集
req.session.is_logged=false
是的,我在这里写了一个代码示例,但它不在我的本地计算机上,很抱歉,我已经更新了代码。您好,感谢回答我的问题,是的,我在这里写了false,但不在代码上对不起。。。我尝试了使用MemoryStore的方法,因为我是这样做的,所以在这行
res.send({response:“Any session.”)上有一个错误
wich说
TypeError:对象函数MemoryStore(){this.sessions={};}没有方法“set”
Hi,感谢您回答我的问题,是的,我在这里写了false,但不是在代码上对不起。。。我尝试了使用MemoryStore的方法,因为我是这样做的,所以在这行
res.send({response:“Any session.”)上有一个错误
wich说
TypeError:ObjectFunction MemoryStore(){this.sessions={};}没有方法“set”
我在我的代码中添加了它,同样的问题,但是我在尝试khurrum qureshi(就在下面)的方法时收到了一条错误消息,我没有这个方法,像我那样设置会话。检查我更新的答案。另外,请确保关闭
res.send({response:“OK”}中的括号
。我已经更新了代码,事实上,MemoryStore是我之前实例化的对象,我已经通过
express.session.MemoryStore
进行了更改,但在刷新页面时仍然无法识别会话…我将其添加到代码中,同样的问题,但尝试khurrum qureshi的方法(就在下面)会收到错误消息我没有,像我一样设置会话。检查我的更新答案。另外,确保关闭
res.send({response:“OK”}中的括号
。我已经更新了代码,事实上,MemoryStore是我之前实例化的对象,我已经通过
express.session.MemoryStore
进行了更改,但在刷新页面时仍然无法识别会话。。。