2016-02-10 132 views
0

我们正在创建一个nodejs应用程序,我需要维护会话。我们使用express来维护节点变量。但问题是,每当我们打到一个新的服务时,一个新的会话正在创建。Nodejs为每个请求创建会话

app.js文件看起来像这样

var RedisStore = require('connect-redis')(session); 
 

 
\t module.exports = function Sessions(url, secret) { 
 
\t var store = new RedisStore({ url: url }); 
 
\t var session = session({ 
 
\t \t secret: 'dfsdfdff', 
 
\t \t store: 'test', 
 
\t \t resave: true, 
 
\t \t saveUninitialized: true 
 
\t }); 
 

 
\t return session; 
 
\t };

var express = require('express'); 
var session = require('express-session'); 
var routes = require('./routes'); 
var http = require('http'); 
var https = require('https'); 
var path = require('path'); 
var Q = require('q'); 
var fs = require('fs'); 
var formidable = require("formidable"); 
var util = require('util'); 
var url = require('url'); 
var request = require('request'); 
var users = require('./routes/language'); 
var user_auth = require('./routes/auth'); 

auth.js文件看起来像这样

exports.generateToken = function(req, res, next) { 
    res.render('index', { 
    page_title: 'PEN_V4'}); 
    var sess = req.session; 
    sess.user_id = 'Hello1'; 
    console.log('Hello 1============'); 
    console.log(sess.user_id); 
    console.log('session*****************************============'); 
    console.log(sess); 
    res.end(); 

} 
exports.myToken = function(req, res, next) { 
    console.log(req.session); 
    console.log('session============'); 
    console.log('session*****************************============'); 
    res.end(); 
} 

app.configure(function() { 
 
     app.use(express.bodyParser()); 
 
     app.use(express.methodOverride()); 
 
     app.use(express.static(__dirname + '/static')); 
 
     app.use(express.cookieParser()); 
 
     app.use(express.session({ 
 
      secret: 'alessios', 
 
      store: MemStore({ 
 
       reapInterval: 60000 * 10 
 
      }), 
 
\t \t \t cookie :{httpOnly: true} 
 
     })); 
 
    });

然后从index.html中调用api的myToken和generateToken。但是两个apis都显示不同的会话。有什么可以指导我们关于我们在做什么的错误?

+0

请发表您如何初始化会话。也请张贴从快递发送的标题。 – bolav

+0

添加标题和初始化方法 –

+0

如果我运行'curl -v http:// localhost:3000 /'我在标题中得到这个答案:'set-cookie:connect.sid = s%3AvrxyuLkQ8JHDS7O5kZ9vL9jU0TOPaGip.K3zFYVzopymsz5eXPMEN5pTlaKBHgZso3DJu3EidmW8;路径= /; HttpOnly'。请发布确认您的应用发送了set-cookie标头。 – bolav

回答

0

您是否设置了express-session中间件?只是需要包装是不够的,你需要使用它,就像这样:

const session = require('express-session');  
const RedisStore = require('connect-redis')(session); 

app.use(session({ 
    store: new RedisStore(config.redis), 
    secret: 'w5qTAcEMgNeNzrPg', 
    proxy: true, 
    resave: true, 
    saveUninitialized: true 
})); 

(在这个例子中,我使用Redis的会话存储)

+0

我以与您建议的 –

0

由于您使用的是内置的bodyParser和cookieParser,这些文件仅包含在4.x之前的Express版本中,所以我推断您使用的是Express的过时版本。通过升级Express可以解决您的问题(有关从3.x升级到4.x的信息:https://strongloop.com/strongblog/express-3-to-4-migration-guide/

设置多个Cookie并因此设置会话cookie时,set-cookie标题似乎有问题没有设置第一个请求(或其他请求应该设置另一个cookie)。这是你的完整设置的情况吗?

有关的问题,并进一步信息可能的修复,请阅读下面的答案我给了另一个问题:Express-session with passport.js multiple cookies

+0

相同的方式使用它,而不是链接以更好地解释答案。 –

+0

我真的没有看到两次发布完全相同的代码和解释的理由,因为这不会使解释本身“更好”。此外@Sumeet没有说明他的设置是否设置了多个cookie,因此不清楚这是否是真正的问题。如果您按照第二个链接(http://stackoverflow.com/questions/36112592/express-session-with-passport-js-multiple-cookies/36310764#36310764),您会发现一个代码示例显示问题(包括生成的头文件)以及在无法升级时解决问题的代码。 –

相关问题