2014-07-08 45 views
0

我正在使用Node.js和Express瀏覽服務器發送的事件。 我設法設置請求處理和寫入流,但現在我正在努力處理會話管理,因爲我無法在後續調用之間保持會話持續。快速 - 會話不會在後續的SSE請求之間保存

Server代碼:

var express = require('express'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 

var app = express(); 
// log all requests 
app.use(function(req, res, next) { 
    console.log(req.method, req.path); 
    next(); 
}); 
app.use(cookieParser()); 
app.use(session({ 
    secret : 'pretty hard to guess', 
    resave : false, 
    saveUninitialized : true 
})); 

// serve test file 
app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/sandbox/test.html'); 
}); 

app.get('/test/:name', function(req, res) { 
    console.log(req.headers); 

    // session is empty 
    console.log(req.session) 

    req.session.name = req.param('name'); 

    // session.name is set 
    console.log(req.session); 

    req.socket.setTimeout(Infinity); 
    res.type('text/event-stream'); 
    console.log(res._headers) 

    res.write('retry: 3000\n'); 
    res.write('data: Hello, SSE!\n\n'); 
}); 

var server = app.listen(8080, function() { 
    console.log('listening on port 8080\n'); 
}); 

微型客戶端應用程序:

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
      function sendReq() { 
       var name = document.getElementById('name').value; 
       var es = new EventSource('test/' + name); 
       es.onopen = function() { 
        var ul = document.getElementById('board'); 
        var li = document.createElement('li'); 
        li.textContent = 'Connected...'; 
        ul.appendChild(li); 
       }; 
       es.onmessage = function(e) { 
        var ul = document.getElementById('board'); 
        var li = document.createElement('li'); 
        li.textContent = e.data; 
        ul.appendChild(li); 
       }; 
       return false; 
      } 
     </script> 
    </head> 
    <body> 
     <form id=sse-form onsubmit="return sendReq();"> 
      <input id=name /> 
      <input type=submit /> 
      <ul id=board></ul> 
     </form> 
    </body> 
</html> 

當訪問localhost:8080/一次送我的名字,我可以看到服務器日誌呼叫的控制檯和設置會話數據和cookie。

如果我再次發送我的名字,會話cookie被設置,但會話爲空,所以會話cookie被重新發送。

我該如何設法在呼叫之間存儲會話數據?

回答

0

resave句柄告訴會話保留您的cookie值。否則,您必須在每個請求中手動重新設置它們。從文檔https://github.com/expressjs/session

app.use(session({ 
    secret : 'pretty hard to guess', 
    resave : true, <----- 
    saveUninitialized : true 
})); 

報價:

重新保存 - 力量會話被保存,即使修改。 (默認: 爲真)

+1

我已經嘗試將'resave'更改爲'true',但無濟於事......這不能解決問題,不幸的是。不管怎麼說,還是要謝謝你! –