socket.io 和express 4 个会话

2024-04-11

我想在我的 socket.io 应用程序中访问 express 4 会话。 我对 Node 不太熟悉,在实现此功能时遇到了一些麻烦。

我找到了一个允许访问express 4会话的npm模块:https://www.npmjs.org/package/session.socket.io-express4 https://www.npmjs.org/package/session.socket.io-express4 or https://github.com/eiriklv/session.socket.io https://github.com/eiriklv/session.socket.io

如果你看下面我的 app.js 代码,我在session, sessionStore or cookieParser设置,因为我无法让这个模块工作。

// init modules
var express = require('express');
var helmet = require('helmet');
var fs = require('fs');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var memoryStore = session.MemoryStore;
var app = express();

// set variables
var options = {
  key: fs.readFileSync('./openssl_keys/server_key.pem'),
  cert: fs.readFileSync('./openssl_keys/server_cert.pem')
};
var cookieSecret = "secret phrase";
var sessionStore = new memoryStore();

app.set('env', process.env.NODE_ENV || 'development');

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser(cookieSecret));
app.use(session({
    secret: cookieSecret,
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
app.use(function(req, res, next){
    res.locals.session = req.session;
    next();

});
app.use(express.static(path.join(__dirname, 'public')));

//routes
require('./routes/index')(app);
require('./routes/test')(app);


// starting http and https servers
var http = require('http').createServer(app).listen(8000, function(){
    console.log("http server listening on port 8000");
});
var https = require('https').createServer(options, app).listen(8080, function(){
    console.log("https server listening on port 8080"); 
});

// starting socket.io & session handler
var serverIO = require('socket.io').listen(https);
var SessionSockets  = require('session.socket.io-express4');
var io = new SessionSockets(serverIO, sessionStore, cookieParser);

io.on('connection', function(err, socket, session){
    if(err) throw err;
    console.log("connected");
    //console.log(session);
    socket.on('clientMessage', function(content) {
        console.log("received client message")
        console.log(content);
    });

});

module.exports = app;

我尝试了多种可能性,例如:

  • 禁用https server.
  • 设置一个cookieParser带有秘密短语的对象(因此它“实际上”将秘密短语导出到io = new SessionSockets(serverIO, sessionStore, cookieParser);)
  • 使用最少的cookie选项。

不管怎样,我对此有点迷失,欢迎任何建议/批评。


UPDATE

好吧,经过多次尝试,我想我可以成功!

问题在于 cookieParser 初始化,正确的方法似乎是:

var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser());

请注意,如果我使用var io = new SessionSockets(serverIO, sessionStore, cookieParser);(代替cookieParser())那么它就不起作用了。这似乎是问题所在。

如果我使用:

app.use(cookieParser("secret phrase"));
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser("secret phrase"));

然后模块崩溃并显示以下错误消息:

session.socket.io-express4/session.socket.io.js:41
ake.signedCookies[key] = handshake.signedCookies[key].match(/\:(.*)\./).pop();
                                                                        ^
TypeError: Cannot call method 'pop' of null

但如果我使用:

app.use(cookieParser("secret phrase"));
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser());

然后一切看起来都很好。

现在在 cookie 解析器文档中(https://github.com/expressjs/cookie-parser https://github.com/expressjs/cookie-parser)它表示您可以传递密钥来对 cookie 进行签名。这是我想要的。

有人可以向我解释一下 cookie 解析器秘密短语和会话秘密短语的关系吗?它们必须相同/不同吗?


这是我针对以下环境的解决方案:

  • 快递4.2.0
  • 套接字.io 1.1.0
  • cookie 解析器 1.0.1
  • cookie 会话 1.0.2

Code:

var cookieParser = require('cookie-parser')();
var session = require('cookie-session')({ secret: 'secret' };

...

app.use(cookieParser);
app.use(session);

...

io.use(function(socket, next) {
    var req = socket.handshake;
    var res = {};
    cookieParser(req, res, function(err) {
        if (err) return next(err);
        session(req, res, next);
    });
});

然后你可以从套接字的握手中访问会话:

io.on('connection', function (socket) {
    console.log("Session: ", socket.handshake.session);
});

对于想知道这是如何/为什么起作用的人:

  • 我们发送handshake通过cookie解析器请求,以便cookie可用
  • 然后我们发送handshake通过会话中间件,就好像它是一个正常的请求
  • 中间件附加session根据要求
  • We use handshake因为无论出于何种意图和目的,这是一个正常的请求,解析器和会话中间件可以正确处理它。这就是为什么您必须访问session通过handshake
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io 和express 4 个会话 的相关文章

  • 错误:找不到模块“jasmine-core”

    我安装了以下内容进行测试 devDependencies jasmine core 2 4 1 karma 0 13 22 karma jasmine 0 3 7 karma phantomjs launcher 1 0 0 运行后karm
  • 如何从@google-cloud/storage读取文件?

    我正在从我的存储桶中检索文件 我收到该文件并想要阅读其内容 但我不想将其下载到我的本地项目 我只想读取内容 获取数据并用它进行其他操作 我的代码 export const fileManager async gt try const sou
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 限制 Axios 请求

    我正在使用 axios 向 Deezer API 发出请求 不幸的是 使用 Deezer 的 API 当您请求艺术家的专辑时 它不包括专辑曲目 因此 我正在通过请求艺术家的专辑 然后对每个专辑执行后续的 axios 请求来解决这个问题 我遇
  • NodeJs 环境变量与配置文件

    实际上 我有一个 NodeJS Express 应用程序 其配置文件包含主机 端口 JWT 令牌 数据库参数等参数 问题是 将这些参数直接保留在环境变量上 没有任何配置文件 并访问它们 而不需要在所有组件和模块中进行 require 配置是
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • Facebook API - fql_query,无效会话

    我正在尝试使用 PHP 库查询 Facebook 我读到的内容不应该需要会话密钥 或者更确切地说 对于我的情况 它不应该需要会话密钥 但下面的代码给出了以下错误 Session密钥无效或不再有效 http wiki developers f
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 浏览器关闭时 Omniauth 会话过期

    在我的 Rails 3 应用程序中 我使用 Omniauth 进行用户身份验证部分 fb twitter 实际上我遵循这个 https github com RailsApps rails3 mongoid omniauth https g
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 在会话 cookie 中存储大量数据会产生什么影响?

    谁能解释一下在会话中存储大量数据的缺点或给我指出一些阅读材料 我也很感兴趣在会话中存储数据和从数据文件读取数据之间是否有任何区别 如果您在会话中存储大量数据 则输入 输出性能会下降 因为会有大量读取 写入 默认情况下 PHP 中的会话存储在
  • node.js通过aws-sdk模块重命名s3对象

    是否可以通过重命名 s3 上的对象aws sdk https www npmjs com package aws sdk 我找不到解决方法 也许有一个临时解决方案 我想我会回答 因为没有人回答过 这个应该有用 create a new s3
  • Node.js 上的 starttls > 0.4.0

    我遇到了这个线程Node js HTTPS 安全错误 https stackoverflow com questions 5136353 node js https secure error其中提到 tls 模块是现在在节点上执行 TLS
  • GraphQL 预期可迭代,但未找到字段 xxx.yyy 的迭代

    我目前正在尝试使用 NodeJS 进行 GraphQL 但我不知道为什么以下查询会出现此错误 library name user name email 我不确定是否type of my resolveLibrary是对的 因为在任何例子中我
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • 从节点服务器访问 Google Calendar API

    由于某种原因 我很难访问 Google 日历 我希望能够在 Node js 服务器的日历中添加和删除事件 我从文件中发现了非常矛盾的信息 我跟着 https developers google com identity protocols
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm

随机推荐

  • Spark DAG 的“withColumn”与“select”不同

    Context 在最近的一次SO post https stackoverflow com questions 59788837 chained spark column expressions with distinct windows
  • MatTabNavBar 不显示箭头

    我注意到 如果容器对于选项卡来说太小 MatTabNavBar 在显示箭头时的行为与常规 MatTabGroup 不同 我使用官方文档构建了MatTabNavBar和MatTabGroup 但是您可以在这里看到MatTabGroup显示了箭
  • ngtable:对嵌套对象进行排序和过滤

    我有一个对象列表要在 ngTable 的表格上显示 我的对象看起来像 obj label string nestObj nestLabel string 在我的控制器中 我想允许对字段 label 和 nestObject label 进行
  • 尝试 Azure 与 Unity 连接时出现“NotImplementedException”(c#)

    我使用的是Unity 2019 3 6f1 我创建了一个简单的 DLL 用于连接到 Azure 并上传文件 但是 当我调用此 DLL 来尝试连接到 Azure blob 存储时 我得到以下堆栈跟踪 NotImplementedExcepti
  • 在PHP中计算两种颜色之间的平均颜色,使用索引号作为参考值

    在 PHP 中 我试图计算不同十六进制颜色之间的平均颜色 以十六进制表示 但是 我还需要能够提供 0 0 到 1 0 之间的索引号 例如 I have color1 ffffff color2 0066CC 如果我编写一个函数来获取平均颜色
  • 如何在Elastic Search 5.6中对分析字段进行字母排序?

    我在弹性搜索中面临字母排序问题 我有一个 Index indexlive 和一个具有以下映射的 users 类型 liveindex mappings users properties user Confirmed type boolean
  • pty 和管道之间的区别

    我一直在从本页的示例中阅读有关 ptys 的内容 http www roucha fr tech corner pty pdip html http www rkoucha fr tech corner pty pdip html 我有两个
  • 计算 3D 平面多边形的质心

    这是一个与此类似的问题one here https stackoverflow com questions 2350604 get the area of a 3d surface 给定定义表面的 3D 坐标列表 Point3D1 Poin
  • Android Material Design 中的“触摸目标尺寸”到底是什么

    参考有关 Material Design 的 Android 文档 我经常发现我们被引导将按钮的 触摸目标 设置为高度 例如 48dp https www google com design spec components buttons
  • Android:align_left居中对齐

    我有一个包含谷歌地图的片段
  • JSONObject 不是字符串错误

    query count 1 created 2015 07 28T05 19 01Z lang en US results quote symbol GITANJALI NS Ask null AverageDailyVolume null
  • Javascript-从 JSON 对象中检索特定键值

    我想从 Json 对象中仅检索某些键值对 在以唯一 id 作为键的用户列表下方 var user 987654321 displayName Wayne profilepic https test1 com fullName Bruce W
  • 如果启用 SSL 代理,为什么 https 请求在 Charles 代理上失败

    我已经在我的 Mac 上安装并配置了 Charles 代理 我可以浏览所有 http 站点并查看 Charles 中的请求 但无法浏览无法连接的 https 站点 Safari 无法打开该页面 因为它无法建立安全 联系 我已经安装了 Cha
  • 使用最短路径计算连接概率

    我想知道 igraph 中是否有一个函数可以计算加权图中顶点之间的连接概率 其中边的权重是相邻顶点的连接概率 我基于这样的邻接矩阵构建了一个图 其中相邻连接概率形成权重 这是针对河流网络 因此图的每个节点仅连接到单个下游节点 我本来希望使用
  • 检查 iOS 互联网连接是否缓慢

    我添加了苹果提供的可达性类 它可以很好地检查互联网连接 如果互联网关闭 我的应用程序会显示消息 但如果互联网很慢 它就会继续加载 我正在使用 wi fi 当 iPhone 通知栏中只有一个可见的点表示 wifi 信号时 我遇到了这个问题 所
  • 我如何知道主屏幕是否已对焦?

    我有一个在 Android 上运行的服务 我需要知道是否有任何应用程序处于焦点状态 或者 桌面 主屏幕 是否处于焦点状态 我不知道这个词是否适合指手机的主屏幕 我如何知道这是焦点还是其他应用程序 在服务内部 我有以下代码来获取正在运行的任务
  • 我可以在播种时将我的所有产品更新给特定用户吗?

    如何更新所有产品以为其分配特定用户 admin User create name gt Admin password gt password walmart Store create name gt Walmart address gt S
  • 用于存储过程的 SQL 表和列解析器

    是否有一个应用程序可以解析一组给定的存储过程 SQL Server 2000 并获取其中使用的所有表和关联列 存储过程可以包含来自不同数据库的表 输出应该是这样的 表AU 列A 列B 列S 表 列 列 列 我用Database Editio
  • 从给定的 WSDL 创建 PHP SOAP 服务

    这可能会被认为是一个非常懒惰的问题 但我向你保证事实并非如此 我已经尝试了好几天让它工作但我就是做不到 我已经获得了一个 WSDL 文件 我需要用 PHP 为其创建一个 SOAP 服务 谁能告诉我正确的做法是什么 服务的接收者期望在调用 g
  • socket.io 和express 4 个会话

    我想在我的 socket io 应用程序中访问 express 4 会话 我对 Node 不太熟悉 在实现此功能时遇到了一些麻烦 我找到了一个允许访问express 4会话的npm模块 https www npmjs org package