使用express/connect-redis在页面重新加载时抓取现有会话

2024-05-26

使用 connect、express 和 socket.io,我试图让我的应用程序在重新连接时获取会话详细信息。我的会话显然在客户端连接时工作,但如果我刷新浏览器上的页面,它会忘记所有内容。
我的会话cookie肯定是一样的,所以不是那样的。

我的代码是我从许多不同来源获取的代码片段的大杂烩,因为那里似乎没有一个完整的示例应用程序。

我错过了什么..?

var qs      = require('querystring'),
    express = require('express'),
    app     = express.createServer(),
    io      = require('socket.io').listen(app.listen(8000)),
    routes  = require('./routes'),
    pCookie = require('connect').utils.parseCookie,
    Session = require('connect').middleware.session.Session,
    RedStore= require('connect-redis')(express),
    sStore  = new RedStore();
   
// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({ store: sStore, secret: 'tehsecretz' }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', routes.index);

io.sockets.on('connection', function (client) {
    var hs = client.handshake,
        session = hs.session;

    console.log('A socket connected called: ' + hs.sessionId);

    var intervalId = setInterval(function() {
        hs.session.reload(function() {
            hs.session.touch().save();
        });
    }, 60 * 1000);

    if (!session.userName) {
        // Prompts the user for a name on the frontend
        client.emit('need-to-register');
    }

    client.on('message', function(msg, c) {
        console.log(session);
        console.log(msg);
    });

    client.on('register-user', function(data, fn) {
        // This retrieves the user's name
        // and - hopefully - saves it to the session.

        data = qs.parse(data);
        session.userName = data.username;

        hs.session.save();
        console.log('Saving: ', session);

        fn('ok');
    });

    client.on('disconnect', function() {
        clearInterval(intervalId);
    });
});

io.set('authorization', function (data, accept) {
    if (data.headers.cookie) {
        data.cookie = pCookie(data.headers.cookie);
        data.sessionId = data.cookie['connect.sid'];

        data.sessionStore = sStore;
        sStore.get(data.sessionId, function (err, session) {
            if (err || !session) {
                accept('Error', false);
            } else {
                console.log(data.sessionId, session);
                data.session = new Session(data, session);
                accept(null, true);
            }
        });
    } else {
        return accept('No cookie transmitted', false);
    }
});

啊。所以在丹尼尔·鲍利格的帖子 http://www.danielbaulig.de/socket-ioexpress/关于这个主题,他引用了标识符sessionID。我认为这只是糟糕的约定(因为我习惯了驼峰命名法)并立即将其更改为sessionId在我的代码中。

当我调试时,我打开了MONITOR在我的 redis 实例上运行并注意到会话正在被写入sess:undefined.

事实证明sessionID是特殊的,在内部作为实际标识符引用。更改所有实例sessionId to sessionID让我可以更好地了解谁在连接!

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

使用express/connect-redis在页面重新加载时抓取现有会话 的相关文章

  • 如何在 Jenkins 服务器上运行 Jest 测试

    我正在尝试运行我的Jest https facebook github io jest 在 Jenkins 部署期间进行测试 如果我 ssh 进入服务器 我可以 sudo 进入 Jenkins 用户并从工作区成功运行测试 但是 当我尝试从
  • Visual Studio 代码断点在使用 TypeScript 的 Node.js 上不起作用

    我尝试了很多解决方案 但没有人适合我 代码执行 但我无法放置断点并调试它 请你帮助我好吗 我尝试过以下 VSCode 配置脚本 type node request launch name Typescript Node JS program
  • Angular2 + Laravel 与实时和 WebSockets

    我构建了一个应用程序 并计划与 Angular 2 和 laravel 进行实时战斗 例如 你按下 攻击 按钮 你的对手就会实时看到他的生命在下降 我的应用程序构建有 前端 角2 Backend PHP Laravel 5 2 现在我正在寻
  • NodeJs 控制台中的 GET /bla - - ms - - 是什么意思?

    当我进入页面时 bla在我的 NodeJS 应用程序中 控制台打印出 GET bla ms 用文字来说 为了更容易谷歌搜索 dash dash ms dash dash 这是什么意思 这是输出morgan https github com
  • 如何检测和测量 Node.js 中的事件循环阻塞?

    我想监视 node js 中事件循环每次运行需要多长时间 但是我不确定衡量这一点的最佳方法 我能想到的最好的方法是这样的 var interval 500 var interval setInterval function var last
  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • Node.js 检测两个猫鼬查找何时完成

    我正在尝试使用自动完成功能初始化两个输入library https www devbridge com sourcery components jquery autocomplete 当我加载页面时 我将触发 Ajax 来初始化两个输入文本
  • 如何在 Node-Red 中的 oneditsave 之后在下拉列表中显示先前选择的值(动态)?

    我有一个自定义节点 其中包含两个彼此独立的下拉菜单 因此 第二个下拉列表值会根据第一个下拉列表中选择的值发生变化 我现在尝试的是 用户拖动我的自定义节点 iotinput 从两个拖放中选择值 按下并单击 完成 他再次拖动另一个自定义节点 i
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • 使用 PM2 将节点作为服务运行 - 连接被拒绝

    我正在关注this https www digitalocean com community tutorials how to set up a node js application for production on ubuntu 16
  • 如何在 VSCode 调试器中执行异步函数? [复制]

    这个问题在这里已经有答案了 如果我在一些 javascript 代码中放入 VSCode 调试器并使用 wait 调用异步函数 它只会返回一个承诺 如何解决调试器中的承诺 以便我可以看到结果是什么 例如 如果我定义一个像这样的函数 cons
  • 为什么此 HTTP 请求在 AWS Lambda 上不起作用?

    我正在开始使用 AWS Lambda 并尝试从我的处理程序函数请求外部服务 根据这个答案 https stackoverflow com a 27932216 473467 HTTP 请求应该可以正常工作 而且我还没有找到任何其他说明的文档
  • 无法在适当的时间对域调用 dispose

    我有一个问题domain模块 目前 我正在尝试捕获请求中引发的任何未捕获的错误 使用express中间件和域 所有请求在调用之前都会通过此函数路由next并继续走正确的路线 app use req res next gt domain cr
  • 使用填充方法在 sails mongo 中进行深层关联?

    我是 sails js 的新手 我正在使用 sails js 与 Mongodb 我在我的 sails 应用程序中使用 populate 进行深层关联时遇到问题 我有这样的关系 Category has many to many relat
  • nvm 与 npm 配置“前缀”选项不兼容:

    我正在尝试运行另一个 NodeJS 版本nvm但出现此错误 nvm use v4 2 4 nvm is not compatible with the npm config prefix option currently set to Us
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • Highcharts 问题 - 在可缩放图表中显示标签

    我有一个缩放柱形图 xAxis 中有 200 多个类别 因此 当它处于初始状态 比例1 1 时 所有这些家伙都显示在X轴下方 即使我将它们垂直放置 也无法读取任何内容 我需要缩放图表以使标签可见 Here s screenshot of t
  • Python SQLAlchemy 用户身份验证失败

    我尝试使用 SQLAlchemy 连接 PostgreSQL 数据库 我创建了一个像这样的新角色 首先 我使用以下命令登录到 postgres 帐户 sudo i u postgres 接下来 发出命令 createuser interac
  • Cordova 构建 - 无法解析 com.android.tools.build:gradle:1.5.0

    升级我的机器 Ubuntu 15 10 的 cordova 和 npm 后 我无法使用 cordova 构建新项目 构建指责 graddle 中存在错误 我做了一些研究并找到了一些可能的解决方案 解决方案例如更改版本和 url graddl
  • checked="checked" 在 Chrome 中不起作用

  • 我的石墨中的 Logstash 指标在哪里?

    这可能是一个菜鸟问题 但我很难找到答案 所以我希望你们能在这里帮助我 我有一个running logstash实例将日志从一台服务器传送到另一台运行 Graphite 的服务器 这是我的输出配置 output stdout codec gt
  • 如何使用 Google App Engine 和 Python 创建 REST 服务?

    我想创建一个 RESTFUL Web 服务 通过访问的 URL 获取请求 然后为该客户端返回适当的文档 例如 如果它是一个天气应用程序 我想通过网络浏览器获取亚特兰大的天气 我会访问http weatherapp appspot com T
  • Pyspark dataframe:如何按组应用 scipy.optimize 函数

    我有一段运行良好的代码 但使用 pandas 数据帧 groupby 处理 但是 由于文件很大 gt 7000 万组 我需要转换代码以使用 PYSPARK 数据框架 这是使用 pandas dataframe 和小示例数据的原始代码 imp
  • 如何使用哈希数组填充 select_tag?

    在 Rails 3 2 应用程序中 我尝试添加一个选择字段 该字段从外部 API 调用获取数据 该数据作为哈希数组返回 name gt NameA id gt 001 name gt NameB id gt 002 我如何使用这些数据来构造
  • git:检查标签,修改某些内容,然后再次标记它

    我觉得我应该知道这一点 但我很困惑 我在 github 上分叉了一个存储库 我需要的是签出一个标签 称为 v1 0 5 修改文件上的语句 使用名为 1 0 5 的新标签 不带 v 重新标记该状态 然后执行对 master 进行同样的更改 让
  • 使用 Apache CXF 更改 WSDL xsd:complexType 名称

    我使用 Apache CXF 发布 Web 服务 即时 生成 WSDL 这很好用 但我想更改生成类型的命名约定 由于服务客户端 C 基于 WSDL 生成代码 因此默认的 xsd complexType 命名会导致类型名称以小写字母开头 以下
  • 如何在产品listing页面显示产品详细描述?

    我想在产品列表页面上的简短描述后显示详细的产品描述 我正在做这个 但什么也没有出现 我也尝试过这个 Mage getModel catalog product gt load product gt getProductId gt getDe
  • Blade 如何处理脚本调用?

    大家好 我在脚本调用方面遇到问题 我在 Laravel 中使用 Blade 除了支持搜索和排序功能的脚本调用之外 一切都正常工作 这是我的层次结构和相应的相关代码 main blade php div class page containe
  • 即使 startService 不返回,peekService 也会返回 null

    我正在尝试使用 AndroidService from a BroadcastReceiver The Service生活在不同的应用程序中BroadcastReceiver 我的理解是 正确的方法是首先调用Context startSer
  • 如何使超类方法返回子类的实例

    我有一堂课叫Test和一个名为SubTest谁延伸Text 我想有一个方法Test将返回实例的类SubTest当接到电话时 我想做 SubTest test new SubTest setTest Hello setOtherTest Hi
  • Rspec : PG::ConnectionBad: PQsocket() 无法获取套接字描述符

    我运行了 rspec 大部分测试都失败了 我对他们遇到了同样的错误 即 Failure Error Unable to find matching line from backtrace ActiveRecord StatementInva
  • Apache Flink 动态设置 JVM_OPT env.java.opts

    是否可以设置自定义 JVM 选项env java opts提交作业时未在作业中指定conf flink conf yaml file 我问的原因是我想在 log4j 中使用一些自定义变量 我也在 YARN 上运行我的工作 我已经使用 CLI
  • 将 2 个不同表中的 2 个值相乘

    我正在尝试使用 SQL 将值 X 乘以值 Y 值 X 位于表 A 中 B 位于表 B 中 我找不到这个问题的答案 表交易 ID Transaction ID Total Amount 1 001 1200 2 002 1500 3 003
  • SHA-256 BigQuery 函数或 UDF

    有人有 UDF 或知道在 BigQuery 中支持 SHA 256 的计划吗 https cloud google com bigquery query reference syntax 16 https cloud google com
  • 在 firebase 函数中设置 dotenv

    我正在尝试将我制作的小型节点表达应用程序移动到 firebase 函数中 该文件有dotenv变量 早些时候我想如果我只是部署并依赖 dotenv 它会起作用 但那并没有发生 于是 我去了firebase的环境配置文章了解如何设置 env
  • 使用express/connect-redis在页面重新加载时抓取现有会话

    使用 connect express 和 socket io 我试图让我的应用程序在重新连接时获取会话详细信息 我的会话显然在客户端连接时工作 但如果我刷新浏览器上的页面 它会忘记所有内容 我的会话cookie肯定是一样的 所以不是那样的