当前位置: 首页 > 面试题库 >

如何与Socket.IO 1.x和Express 4.x共享会话?

司健柏
2023-03-14
问题内容

如何与Socket.io 1.0和Express
4.x共享会话?我使用Redis商店,但我认为这没有关系。我知道我必须使用中间件来查看cookie和获取会话,但是不知道如何。我搜索了但找不到任何工作

    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'));
        }
    });

问题答案:

解决方案非常简单。它只是没有很好的记录。也可以通过如下所示的小型适配器将快速会话中间件用作Socket.IO中间件:

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

这是Express 4.x,Socket.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);


 类似资料:
  • 我搜索了一下,只能找到这个关于socket.io0.9的wiki页面。 最终,我找到了engine.io-client的文档(socket.io-client基于1.x分支)。这是我写的代码,似乎正在工作。但是,我想知道这是正确的还是我做错了什么: 奇怪的是,仅仅将属性设置为仅具有的数组是不够的;我还必须禁用。这是正确的吗? 我有了一些新发现。 当仅设置为时,是否启用并没有什么区别。这正常吗?

  • 在这个 Matplotlib 数据可视化教程中,我们将讨论sharex选项,它允许我们在图表之间共享x轴。将sharex看做『复制 x』也许更好。 在我们开始之前,首先我们要做些修剪并在另一个轴上设置最大刻度数,如下所示: ax2.yaxis.set_major_locator(mticker.MaxNLocator(nbins=7, prune='upper')) 以及 ax3.yaxis.se

  • 我刚开始在Node.js应用程序中学习Express4.0,我发现它生成了文件,在该文件上只编写了应用服务器和端口设置,其他所有东西(如中间件和路由)都在文件中定义。 但是,我不确定这个是做什么的。我使用过Express3.x,并且始终在相同的文件上定义服务器和端口设置以及路由和中间件,并使用启动我的node应用程序。那么使用有什么意义呢?它是否只是将服务器和端口定义与其他分开? 现在,当我使用e

  • 场景:在使用nuxtjs 服务器渲染的时候接口数据都是asyncData进行请求的,之前用户在页面输入了一些数据等,前端这边都是缓存到localStorage 页面刷新的时候还可以拿到,现在的问题:页面刷新的时候客户端操作的数据如何实现服务器数据共享呢? 有什么好的思路吗?我想到过用cookie?但是太小了不能满足我的需求

  • 我在Vert发展。x(基于Netty和Hazelcast),我正在尝试在两个服务器实例之间共享数据(在同一局域网上的不同机器中的每个实例)。 我的问题是我不知道如何配置vert. x服务器以允许它们共享它们的并发内存映射(理论上说这是可能的)。 我已经阅读了Vert. x和Hazelcast的许多文档,但还没有结果。(我不知道如何强制vert. x加载hazelcast xml配置文件)。 提前感

  • 我需要在 Eclipse 中设置 Tomcat 8.5.x 服务器版本。当我尝试使用Eclipse GUI创建服务器时,我会选择Eclipse Luna作为最新版本“Apache Tomcat v8.0”的选择。当我选择它并浏览到我的Tomcat 8.5.x服务器时,我收到以下阻止错误消息: 此目录下的Apache Tomcat安装版本为8.5.0。预计会安装Tomcat 8.0。 尝试 TomE