Express-Session、Connect-Redis 和 einaros/ws

2024-04-20

我似乎在让 Express、express-session、connect-redis 和 websockets/ws 很好地协同工作时遇到了一些麻烦。这很可能与我对这些模块和编码的总体理解还有限有关。这里的大部分代码取自存储库中的相应示例以及试图完成类似任务的其他来源。

因此,我们这里有一个启用了 websocket 的应用程序,它试图立即启动与服务器端应用程序的 websocket 连接,该应用程序当前除了提供 websocket 功能之外什么也不做。该请求首先到达我们的 NGINX API 代理,该代理将请求代理到本地运行的 Node 应用程序实例。

Node 应用程序应配置为接受并立即升级到 websocket 的请求,创建一个唯一的会话 id 和 cookie,然后将其存储在我们的 Redis 框中。除了 Redis 中的存储之外,所有这些都可以正常运行。

以下代码无需 connect-redis 即可工作(我直接使用 node_redis 客户端来查询 Redis 框以获取任何键):

'use strict';

const express = require('express');
const http = require('http');
const ws = require('ws');
const redis = require('redis');
const client = redis.createClient(6379, '10.0.130.10', {no_ready_check: true});
//const RedisStore = require('connect-redis')(session);


var session = require('express-session')({
    //store: new RedisStore({host: '10.0.130.10', port: '6379', ttl: 60, logErrors: true}),
    cookie: {secure: true, maxAge: 3600, httpOnly: true},
    resave: false,
    saveUninitialized: true,
    secret: '12345'
});


// Define Express and WS servers
const app = express();
const server = http.createServer(app);
const wss = new ws.Server({ server });


// Client heartbeat
function heartbeat() {
    this.isAlive = true;
}


// WS Websocket
wss.on('connection', function connection(ws, req) {

    // Obtain Client IP address from NGINX x-forwarded-for proxy header
    let clientIp = req.headers['x-forwarded-for'];

请求后服务器输出:


收听:10031

会话 ID:eavjOlls59jtjQd-gZ0EIhqf3_P6sYMr

会话 Cookie: {"originalMaxAge":3600,"expires":"2017-05- 27T13:59:19.663Z","安全":true,"httpOnly":true,"路径":"/"}

Redis 对索引键的响应:


通过取消注释相关部分来启用 connect-redis 会导致启动时服务器上出现以下错误消息:


/home/ubuntu/app/njs/nl-websocket-dev/node_modules/connect-redis/lib/connect-redis.js:39 var Store = session.Store; ^

类型错误:无法读取未定义的属性“Store” 在 module.exports (/home/ubuntu/app/njs/nl-websocket-dev/node_modules/connect-redis/lib/connect-redis.js:39:22) 在对象。 (/home/ubuntu/app/njs/nl-websocket-dev/stackoverflow.js:8:48) 在 Module._compile (module.js:409:26) 在 Object.Module._extensions..js (module.js:416:10) 在 Module.load (module.js:343:32) 在 Function.Module._load (module.js:300:12) 在 Function.Module.runMain (module.js:441:10) 启动时(node.js:139:18) 在节点.js:968:3


请注意,我按照自己的方式启动了快速会话,这样我就可以将其绑定到 websockets/ws 中。我已经尝试了相当多的配置,这实际上是唯一允许快速会话和 websockets/ws 一起工作的配置。我从“Azmisov”这里得到了要点(特别不包括 connect-redis):

以这种方式将 Express-Session 调用到 websockets/ws 中确实可以正常工作。但是,使用此配置将 connect-redis 添加到 express-session 上,然后在 websockets/ws 内调用该组合是问题开始的地方。

任何有关如何实现此功能的想法都是非常受欢迎的。


你正在使用session here:

const RedisStore = require('connect-redis')(session);

稍后将在此处定义:

var session = require('express-session')(...);

这就是第一个问题(session未定义)。

另一个问题是connect-redis应该通过的结果require('express-session'),而您的代码尝试向它传递它的实例化版本。

这两个问题都可以这样解决:

const Session    = require('express-session');
const RedisStore = require('connect-redis')(Session);

var session = Session({
  store: new RedisStore(...),
  ...
});

我也不明白怎么办session正在附加到app您发布的代码中的任何位置,但它并不完整,所以我假设您正在调用的某个地方app.use(session).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express-Session、Connect-Redis 和 einaros/ws 的相关文章

  • 使用mockery和sinon模拟类方法

    我正在学习使用带有 sinon 的节点模块模拟进行单元测试 仅使用模拟和普通类 我就可以成功注入模拟 不过 我想注入一个 sinon 存根而不是一个普通的类 但我在这方面遇到了很多麻烦 我试图嘲笑的班级 function LdapAuth
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • Mosquitto Broker 服务拒绝在 Websocket 上启动

    我正在尝试启动 Eclipse Mosquitto 代理服务来监听 websockets 添加 listener 8083 protocol websockets 在 mosquitto conf 如果我只使用listener 8083 服
  • express-session:滚动会话过期配置

    所以我在 mongo 商店中使用快速会话 如下所示 app use session secret some secret here saveUninitialized false resave false store new MongoSt
  • sails.js 水线嵌套填充查询

    我有一个返回对象的多个结果的查找查询 该对象包含一个包含另一个模型的模型 问题是水线不支持嵌套填充 因此它填充第一个模型 但不填充它的内部模型 我见过的所有示例都是针对 findOne 查询的 我正在寻找一种方法来解决返回多个结果的查找查询
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • 茉莉花节点没有输出

    我是 JavaScript Node js 和 jasmine 的新手 我正在尝试运行 Node Craftsman Book 一书中的测试 FilesizeWatcher 我创建了 package json 文件并运行 npm insta
  • Excel Add In - console.log 在哪里输出它的消息 - NodeJS

    我正在尝试使用 JavaScript API 创建 Excel 插件 但我不明白 console log 在哪里输出它们的消息 所有 Microsoft 文档都包含 console log 示例 但没有解释 console log 输出消息
  • Node.js:您什么时候知道异步任务集合何时完成?

    我想深入一个目录 并根据正则表达式检查我在其中看到的每个文件的名称 基本上是通用unix的一个版本find命令 仅用 Node js 编写 我不关心文件的顺序 但我确实想确保获得所有文件 我有以下代码 我认为 它接近我想要的 它需要一个 s
  • Node.js 中的 Twilio 短信回复

    我正在使用 node js 中的 twilio 编写移动通知系统 目前可以向用户发送短信 但我希望用户能够回复我 我需要收集用户发送文本的电话号码以及消息的内容 以查询我的 mongoosedb 我找不到太多这方面的信息 因此非常感谢您的帮
  • 如何在浏览器同步中配置端口

    我有一个gulp任务运行于browser sync 默认情况下它运行在node js服务器的端口3000上 我想将默认端口更改为任何其他端口 例如3010 var gulp require gulp connect require gulp
  • CORS 问题从 React 应用程序 > 节点服务器 > 重定向到 Google OAuth2 身份验证发出 AJAX 请求

    大家好 过去两天我一直在绞尽脑汁研究这个问题 但没有运气 这是我在尝试从我的 React 应用程序 localhost 3000 使用 Google Oauth2 Passport 策略进行身份验证时遇到的错误 我正在 localhost
  • NodeJS os 模块无法使用 userInfo()

    https nodejs org api os html os os userinfo options https nodejs org api os html os os userinfo options 节点版本 v4 2 6 NPM版
  • 将新属性动态添加到 Node 中现有的 JSON 数组中

    我需要添加当前 JSON 中不存在的属性 json 对象如下所示 var jsonObj result OK data 我想在 数据 中添加温度 我可以像下面那样做 jsonObj data push temperature 然后 我想在
  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • 天文台服务器启动失败 - 无法创建套接字服务器

    我正在为自己构建一些内部工具 以使用我设置的一些模板以及可以在应用程序之间共享的一些附加功能来生成 Flutter 应用程序 目前 代码可以编译 构建并部署 但它会卡在第一个视图 空白屏幕 上 并在失败之 前重试启动 Observatory
  • Node.js es6 使用index.js 导出/导入

    我有以下文件夹结构 src index js lib test js dist examples example js src lib test js export default class Test src index js impor
  • 无法在 AWS Lambda 自定义授权方中验证 Twilio 请求

    我使用 NodeJS 构建了一个自定义授权者 lambda 函数 并将其配置为授权 AWS 中的另一个 lambda 函数 这个其他函数是从 HTTP 端点触发的 并且具有我在 Twilio Messaging Service 中配置为 w
  • 带有服务总线的 SignalR Azure 云服务

    我使用 SignalR 构建了一个简单的聊天应用程序那里有教程 http www asp net signalr overview getting started tutorial getting started with signalr
  • 在 AWS Lambda 中共享代码

    在 AWS Lambda 函数之间共享代码的首选方式是什么 我有这样的结构 functions a 节点模块 index js 包 json b 节点模块 index js 包 json c 节点模块 index js 包 json 这让每

随机推荐