express.js 正在解析 cookie?

express.js parsing cookies?

我正在尝试使用旧库 balloons.io 作为聊天应用程序的基础,但它已经过时了,在这个特定的代码中,我试图弄清楚如何使用 express 4x 来解析cookie 获取 sid 而不是从 req.session

因为 express 4x 不再使用 connect 我如何才能在新的 express 版本中做类似于下面的事情?

/*
 * Module dependencies
 */

var sio = require('socket.io')
  , parseCookies = require('connect').utils.parseSignedCookies
  , cookie = require('cookie')
  , fs = require('fs');

/**
 * Expose Sockets initialization
 */

module.exports = Sockets;

/**
 * Socket.io
 *
 * @param {Express} app `Express` instance.
 * @param {HTTPServer} server `http` server instance.
 * @api public
 */

function Sockets (app, server) {
  var config = app.get('config');
  var client = app.get('redisClient');
  var sessionStore = app.get('sessionStore');

  var io = sio.listen(server);
  io.set('authorization', function (hsData, accept) {
    if(hsData.headers.cookie) {
      var cookies = parseCookies(cookie.parse(hsData.headers.cookie), config.session.secret)
        , sid = cookies['balloons'];

      sessionStore.load(sid, function(err, session) {
        if(err || !session) {
          return accept('Error retrieving session!', false);
        }

        hsData.balloons = {
          user: session.passport.user,
          room: /\/(?:([^\/]+?))\/?$/g.exec(hsData.headers.referer)[1]
        };

        return accept(null, true);

      });
    } else {
      return accept('No cookie transmitted.', false);
    }
  });

  });

};

不确定这是否有帮助,但是 Cookie 中的 express 4.x 解析已提取到 cookie-parser 包中。我不确定,但您可以将 connect.util.parseSignedCookies 换成 cookieParser.parseSignedCookies`。

我能帮到你的就这些了,因为我还没有用过 socket.io。

function Sockets (app, server, pub, sub, sessionStore) {
  var config = app.get('config');
  var secrets = require('./config/secrets');
  var client = pub;

  var io = sio.listen(server);
  io.set('authorization', function (handshake, callback) {

    if(handshake.headers.cookie) {

      // pay attention here, this is how you parse, make sure you use
      // cookie-parser and cookie
      var cookies = cookie.parse(handshake.headers.cookie);
      var sid = cookieParser.signedCookie(cookies['balloons'], secrets.sessionSecret);

      // get the session data from the session store
      sessionStore.load(sid, function(err, session) {
        if(err || !session) {
          return callback('Error retrieving session!', false);
        }

        // this is not storing the data into the handshake object
        handshake.headers.xygaming = {
          user: session.passport.user,
          room: /\/(?:([^\/]+?))\/?$/g.exec(handshake.headers.referer)[1]
        };

        return callback(null, true);

      });

    } else {
      return callback('No cookie transmitted.', false);
    }
  });

}