2016-02-10 207 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),您會發現一個代碼示例顯示問題(包括生成的頭文件)以及在無法升級時解決問題的代碼。 –

相關問題