2014-09-05 70 views
0

使用ExpressJs 4和Primus,我可以共享Express会话。如何写入与Primus的Expressjs会话

primus.on('connection', function (spark) { 
    var req = spark.request; // Here, I have the Express session 
    req.session.foo = 'bar'; // I try to write into the session. 
}); 

当我写{ foo: 'bar' }值到会话,我不能从一个标准的HTTP调用快车检索。

app.get('/api/...', function (req, res) { 
    console.log(req.session.foo); // Print undefined :'(
    res.send(); 
}); 

输出是undefined。你能解释我为什么吗? 谢谢。

回答

2

根据快件会议文件,我们可以将会话保存到商店。 https://github.com/expressjs/session#sessionsave

primus.on('connection', function (spark) { 
    var req = spark.request; // Here, I have the Express session 
    req.session.foo = 'bar'; // I try to write into the session. 
    req.session.save(); // Save the session to the store 
}); 

然后,它工作得很好!

+3

这是正确的, '.save'呼叫是必需的。正常情况下,当正常的HTTP请求结束时,它会被快速调用,因为它们侵入'res.end'方法并强制执行'req.session.save()'。但是你正在处理长时间运行的HTTP请求,并且会话没有附加到实际的HTTP.Response实例,而是Primus的Spark/Socket。 – 3rdEden 2014-09-05 12:05:32

+0

谢谢@ 3rdEden – 2014-09-05 12:21:09

+0

我试图做同样的事情,但我的错误是'对象#没有方法'保存'。有人知道改变了什么吗? – 2015-05-20 18:31:08

1

以下是我有它目前正在(快速4.13.4;博智4.0.5)

App.js

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

var sockjs = require('sockjs'); 
var http = require('http'); 
var Primus = require('primus'); 
var realtime_functions = require('./custom_modules/realtime_functions.js'); 

var app = express(); 

var app_secret_key = 'app secret'; 
var cookieparser = cookieParser(app_secret_key); 
var sessionstore = new session.MemoryStore(); 

app.use(cookieparser); 
app.use(session({ 
    secret: app_secret_key, 
    saveUninitialized: false, 
    resave: false, 
    store: sessionstore 
})); 

realtime_functions(app, cookieparser, sessionstore); 

realtime_functions.js

var primus_start = function(express, cookies, store) { 

    var server = http.createServer(express); 

    var primus = new Primus(server, {transformer: 'SockJS', parser: 'JSON'}) 
    primus.use('rooms', primusRooms) 
    server.listen(3000, '0.0.0.0'); 

    primus.before('cookies', cookies); 
    primus.before('session', function session(req, res, next) { 
    try { 
     var sid = req.signedCookies['connect.sid']; 
     if (!sid) { return next(); } 
     req.pause(); 
     store.get(sid, function (err, session) { 
     if (err) { 
      primus.emit('log', 'error', err); 
      return next(); 
     } 
     if(session) { 
      req.sessionID = sid; 
      req.sessionStore = store; 
      req.thesession = store.createSession(req, session); 
     } 
     req.resume(); 
     next(); 
     }); 
    } catch(error) { 
     console.log(error); 
    } 
    }); 

    primus.on('connection', function(spark) { 
    spark.on('data', function(data) { 
     spark.request.thesession.addthis = "save this to session"; 
     spark.request.thesession.save(); 
    }); 
    }); 
} 
module.exports = primus_start; 
相关问题