如何与Socket共享会话.io 1.0和Express 4.十、我用的是Redisstore ,但我相信这不重要.我知道我必须使用中间件来查看cookies和获取会话,但不知道如何使用.我搜索了一下,但没有找到任何工作

    var RedisStore = connectRedis(expressSession);
    var session = expressSession({
        store: new RedisStore({
            client: redisClient
        }),
        secret: mysecret,
        saveUninitialized: true,
        resave: true
    });
    app.use(session);

    io.use(function(socket, next) {
        var handshake = socket.handshake;
        if (handshake.headers.cookie) {
            var str = handshake.headers.cookie;
            next();
        } else {
            next(new Error('Missing Cookies'));
        }
    });

推荐答案

解决方案出人意料地简单.只是没有很好的记录.可以将express会话中间件用作套接字.IO中间件也有这样一个小适配器:

sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

下面是express 4的完整示例.x、 插座.IO 1.x和Redis:

var express = require("express");
var Server = require("http").Server;
var session = require("express-session");
var RedisStore = require("connect-redis")(session);

var app = express();
var server = Server(app);
var sio = require("socket.io")(server);

var sessionMiddleware = session({
    store: new RedisStore({}), // XXX redis server config
    secret: "keyboard cat",
});

sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res || {}, next);
});

app.use(sessionMiddleware);

app.get("/", function(req, res){
    req.session // Session object in a normal request
});

sio.sockets.on("connection", function(socket) {
  socket.request.session // Now it's available from Socket.IO sockets too! Win!
});


server.listen(8080);

Node.js相关问答推荐

当我使用 uuid 代码意外崩溃,然后工作正常?

fs.writefile 选项参数的可能值,尤其是只读文件的整数

如何限制 cron 表单将消息推送到 RabbitMQ?

如何列出我与 npm 链接的所有 Node.js 模块

单元测试 Node.js 和 WebSockets (Socket.io)

Node Sass 还不支持你当前的环境:Windows 64-bit with Unsupported runtime (88)

如何在 DENO 中使用 npm 模块?

`npm install` 在 node-gyp 重建时失败,并带有`gyp:未检测到 Xcode 或 CLT 版本!`

.js 和 .mjs 文件有什么区别?

如何向 .env 文件添加注释?

错误消息:MongoError: bad auth Authentication failed through URI string

在多个 .env 文件之间切换,例如 .env.development 和 node.js

有没有办法强制 npm 生成 package-lock.json?

使用 nvm-windows 时更新 npm

节点 --experimental-modules,请求的模块不提供名为的导出

如何使用 Puppeteer 从输入中删除现有文本?

reCAPTCHA - 验证用户响应时的错误代码:'missing-input-response'、'missing-input-secret'(POST 上缺少详细信息)

找不到模块'@babel/core'

(节点:63208)DeprecationWarning:collection.ensureIndex 已弃用.改用 createIndexes

使用绝对路径导入组件时,Jest 给出“找不到模块”