【问题标题】:How to write into an Expressjs session with Primus如何使用 Primus 写入 Expressjs 会话
【发布时间】:2016-02-28 02:38:16
【问题描述】:

使用 ExpressJs 4 和 Primus,我可以共享 Express 会话。

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 express 调用中检索它。

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

输出为undefined。你能解释一下为什么吗? 谢谢。

【问题讨论】:

    标签: express primus


    【解决方案1】:

    根据 express-session 文档,我们可以将 session 保存到 store。 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
    });
    

    那么,效果很好!

    【讨论】:

    • 没错,.save 调用是必需的。通常,当正常的 HTTP 请求结束时,这将通过 express 调用,因为他们破解了 res.end 方法并在那里强制使用 req.session.save()。但是您正在处理一个长时间运行的 HTTP 请求,并且会话没有附加到实际的 HTTP.Response 实例,而是 Primus 的 Spark/Socket。
    • 我正在尝试做同样的事情,但我的错误是Object #<Object> has no method 'save'。有人知道发生了什么变化吗?
    【解决方案2】:

    这是我目前的工作方式(Express 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2015-06-01
      • 2011-07-31
      • 2013-02-08
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多