2014-09-05 5 views
0

Используя ExpressJs 4 и Primus, я могу поделиться сеансом Express.Как записать в сеанс Expressjs с Primus

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, но Spark/Socket Primus. – 3rdEden

+0

Спасибо @ 3rdEden –

+0

Я пытаюсь сделать то же самое, но моя ошибка: «Объект № не имеет метода« сохранить ». Кто-нибудь знает, что изменилось? –

1

Вот как у меня он работает в настоящее время (Экспресс 4.13.4; Primus 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; 
Смежные вопросы