节点高速通道-会话管理

2024-02-22

我为 ArangoDB for ConnectJS 编写了一个会话存储驱动程序。它正在工作,尽管仍处于 alpha 阶段,但我有几个问题。

过期属性为“false”的第一个会话仅在用户代理的持续时间内保留。我注意到浏览器窗口关闭时不会调用 session.destroy() 。这会导致商店中留下“废弃”会话。我怎样才能有效地清除这些呢?有没有办法定期搜索并销毁废弃的会话?

其次,我已经实现了本页概述的会话存储的最低要求:http://www.senchalabs.org/connect/session.html http://www.senchalabs.org/connect/session.html(接近底部)

那就是获取、设置和销毁。另外两种推荐的方法是长度和清晰。这些方法到底应该做什么?我假设长度返回会话处于活动状态的时间长度? “清除”与破坏有何不同?


除非您在客户端上设置一些事件来通知服务器窗口正在关闭,否则服务器将无法知道会话不再使用。

您需要在头脑中将会议视为两个部分。一部分是在节点和浏览器之间传递的令牌(cookie)。第二个是存储中会话的实际持久性(基本 MemoryStore 或 Redis,或者另一个数据库的新会话存储)。所有连接会话代码所做的就是将这些与每个请求进行匹配。

  • 检查会话 cookie
  • 如果存在,请尝试在商店中查找
  • 使从存储中检索到的数据可用于请求
  • 请求结束时,更新cookie的TTL信息
  • 将会话写回存储

请注意,除非您使用 MemoryStore,否则 Node 不会在内存中保存会话数据,除非您的请求正在对其进行操作。 (嗯,它会在内存中保存一段时间,但不会被引用并受到垃圾收集)。当您考虑各种部署场景时,这是有道理的。

因此,服务器端会话过期的工作就落到了 Store 本身身上。 Redis 在这方面表现出色的原因之一是它可以自动管理过期的内容,您可以看到connect-redis doing 在其集合操作中 https://github.com/visionmedia/connect-redis/blob/master/lib/connect-redis.js#L145:

  RedisStore.prototype.set = function(sid, sess, fn){
    sid = this.prefix + sid;
    try {
      var maxAge = sess.cookie.maxAge
        , ttl = this.ttl
        , sess = JSON.stringify(sess);

      ttl = ttl || ('number' == typeof maxAge
          ? maxAge / 1000 | 0
          : oneDay);

      debug('SETEX "%s" ttl:%s %s', sid, ttl, sess);
      this.client.setex(sid, ttl, sess, function(err){
        err || debug('SETEX complete');
        fn && fn.apply(this, arguments);
      });
    } catch (err) {
      fn && fn(err);
    } 
  };

您可以看到它将 TTL 除以 1000,因为它使用秒而不是毫秒作为过期时间。这最受欢迎的 MongoDB 会话 https://www.npmjs.org/package/connect-mongostore 以同样的方式使用 MongoDB 的 TTL 功能。

因此,这是一种很长的说法,您要么依赖数据库引擎自动提供服务器端会话过期,要么需要自己实现过期。您可以在节点应用程序外部有一个进程(可能是另一个节点进程)来执行此操作,或者您的商店实现可以安装 SetInterval 任务来定期检查和清理它。举个例子,一个基于 MySQL 的会话存储就是这么做的 https://github.com/nlf/connect-mysql/blob/master/lib/connect-mysql.js#L80

关于你问题的第二部分,什么是length and clear正在做?评论者是正确的,RedisStore 没有实现这些,并且可以安全地忽略它们,但是您可以在内存存储源代码 https://github.com/expressjs/session/blob/master/session/memory.js。不太令人兴奋。

clear如果提供了回调,则清空所有会话和回调:

MemoryStore.prototype.clear = function(fn){
  this.sessions = {};
  fn && fn();
};

length只需回调商店中的会话数即可:

MemoryStore.prototype.length = function(fn){
  fn(null, Object.keys(this.sessions).length);
};

希望这有帮助。

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

节点高速通道-会话管理 的相关文章

  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • 将 TypeScript 项目与 Webpack 捆绑时,Node.js 提示“ReferenceError: require is not Define”

    我有一个简单的test ts我想使用 webpack 捆绑的文件 该文件包含一些代码和以下导入 没有任何错误 import from interval Observable of pipe Subject timer BehaviorSub
  • 在 Google App Engine 上连接 Mongoose

    我已在 Google App Engine 上成功部署了自定义 Node js 应用程序 但是 我在启动应用程序时遇到问题 因为猫鼬在尝试连接时超时 令人沮丧的是 猫鼬在我的本地计算机上以完全相同的参数连接得很好 我的 MongoDb UR
  • 检查用户是否从后端 Firebase 身份验证登录

    在我的前端 用户使用 Firebase 身份验证浏览器登录 那部分工作得很好 除了 Firebase 后端之外 我还有提供其他内容的 NodeJS 后端 但是 我需要仅向经过身份验证的用户提供内容 我的问题是 有没有办法让我的 NodeJS
  • 等待承诺的 fs.writeFile 与 fs.writeFileSync

    此选项之一有一些优点吗 1 const fs require fs const testFunc1 async gt fs writeFileSync text txt hello world 2 const fs require fs c
  • crypto createHMAC 输出根据 Nodejs 版本而有所不同

    我在升级节点版本时遇到加密模块问题 创建的HMAC取决于节点的版本 您将在下面找到重现该问题的代码片段 如果我将密钥编码为 BASE64 或任何 HMAC 不依赖于 node js 版本 如果我将其编码为二进制 则当我更改 Node js
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 如果 Grunt 任务的子任务之一失败,如何使其失败?

    我在 grunt 中有一个构建任务 如下所示 grunt registerTask build jshint uglify 问题是 即使 jshint 任务失败 uglify 任务也会运行 如果它的子任务之一失败 如何使 build 任务终
  • 通过node.js的npm安装gulp会破坏windows

    我想在我的 Windows 机器上使用 gulp 它实际上工作得很好 除非我尝试使用创建的文件 例如推送到 github 或删除 然后它就崩溃了 因为文件路径太长 这似乎是一个相当常见的问题 https github com joyent
  • 如何在 Shiny 应用程序中访问/打印/跟踪当前选项卡选择?

    我正在一个闪亮的应用程序中工作 我希望能够访问用户在会话中当前所在选项卡上的信息 我有一个观察事件 用于侦听要单击的特定按钮 简而言之 我想存储 打印用户单击此按钮时所在的当前选项卡 单击此按钮后 选项卡将更改为带有 updateTabIt
  • 处理从nodejs到mongo db的连接丢失

    当nodejs和mongodb服务器之间的连接丢失时 我试图得到 连接丢失 或类似的信息 我使用本机驱动程序并具有以下代码 var mongo require mongodb var server new mongo Server host
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • 在node.js 0.12.x中使用libuv函数

    我写了一个node js c 插件 在node js 0 10 x下可以成功编译 但是当迁移到0 12 x时 出现了一些错误 例如error C2065 uv work t undeclared identifier 我想知道我是否可以在0
  • socket.io xhr 在连接缓慢时出现错误(3G 移动网络)

    当我在 3G 移动网络 互联网连接速度慢 上测试我的真实聊天应用程序时 Socket io反复断开然后重新连接 我已经记录了原因 它说 xhr post error 这提高了 transport error 然后断开连接 我可以知道什么意思
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • 可注入的“PlatformLocation”需要使用JIT编译器进行编译,但“@angular/compiler”不可用

    我的 Angular 应用程序通过 Node 16 13 0 提供服务 更新到 Angular 13 后 我收到以下错误 可注入 class PlatformLocation 的 JIT 编译失败 文件 Users btaylor work
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 将基本的 Node.js 应用程序部署到 openshift 在 git Push 上出现错误

    我使用 openshift 网站上的过程设置了一个默认节点应用程序 在我的 ubuntu 盒子上做了一个 git 克隆 编辑了readme md 做了一次提交 并尝试推送到仓库 出现很多 npm fetch failed 错误 以及很多 E
  • 让 Jest 全局设置和全局拆卸在 TypeScript 项目中工作

    我想运行一个在运行测试之前打开数据库连接的函数 全局设置 以及另一个在运行测试后关闭数据库连接的函数 全局拆卸 目前我有以下配置 包 json jest testEnvironment node globalSetup src jest g
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic

随机推荐

  • 如何让机器人 DM 列出人员列表? (Discord.py)(重写)

    所以这会向我 提及的任何人发送一条私信 bot command pass context True async def pm ctx user discord User await user send hello 我如何更改它以向文本文件中
  • 使用 PyQt5,如何使 QComboBox 可搜索?

    我正在使用 PyQt5 制作 GUI 在它上面 我有一个 QComboBox 其中有一个包含 400 多个项目的下拉列表 我想知道是否有什么方法可以在 QComboBox 中输入来搜索匹配的案例 你可以使用QCompleter为了这 对于可
  • 在 Java 中旋转 NxN 矩阵

    这是破解编码面试中的一个问题 该解决方案表示 程序先旋转外边缘 然后旋转内边缘 但是 我在遵循两个 for 循环的逻辑时遇到了困难 有人可以解释代码的逻辑吗 例如为什么他们执行 layer top 和 bottom gt left 等四个步
  • 转义sql插入字符串的最佳方法?

    转义 sql 插入 更新字符串的最佳方法是什么 我想允许使用特殊字符 包括 和 在插入语句中使用每个字符串之前 搜索和替换每个字符串的最佳方法是吗 Thanks 重复 防御sql注入和跨站脚本的最佳方法 https stackoverflo
  • 如何在本地机器和minikube之间传输文件?

    我使用的是 Ubuntu 16 0 4 操作系统 并在其上安装了 minikube 我需要将一些文件复制到 minikube 那么我该怎么做呢 我尝试了下一个命令 但它询问我密码 但我不知道 scp media myuser sourceF
  • 如何安装特定版本的 H2O

    我需要安装旧版本的 H2O 因为即使版本只有一个 3 26 0 2 与 3 26 0 3 模型加载也不起作用 我正在努力寻找可以找到下载链接的页面 为什么它不存在 所有软件都有一个存档或旧版本页面 我还尝试使用当前版本的链接 但没有运气 因
  • 在网络浏览器中实现一个好的 redis 客户端需要什么?

    之前已经有人问过这个问题我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗 https stackoverflow com questions 5759120 can i connect directly to
  • 如何在 Flutter 中的 Scaffold.drawer 中保存 widget 的状态?

    我想保持小部件的状态Scaffold drawer The Scaffold drawer是一个自定义小部件 它有一个升起按钮在里面 当单击按钮时 按钮中的文本发生变化 但是 当抽屉关闭并重新打开抽屉时 更改的文本将被重置 我已经使用 与A
  • Graphviz --- 边标签距离另一条边太近

    我有以下代码 其结果如下图所示 正如您所看到的 边缘和边缘标签周围有点拥挤 尤其是 a 周围 创造更多空间的最佳方法是什么 以便人们可以清楚地看到哪个标签属于哪个边缘 digraph finite state machine pad 0 2
  • “存储”REST 原型如何不创建新资源和新 URI?

    REST API 设计表明有四种资源原型 文档 集合 存储和控制器 存储不创建新资源 因此 商店永远不会生成新的 URI 一个例子 PUT users 12245 favorites boston celtics 一位用户将波士顿凯尔特人队
  • Jersey 2.26 和 Spring 4.3.10,但没有 HK2

    是否可以将 Jersey 2 26 x 配置为仅依赖 Spring 进行注入而不是 HK2 我知道 Jersey 现在与 Spring 兼容 但是是否也可以完全摆脱 HK2 不 不是 Jersey 使用了 hk2 的许多特殊功能 例如与 S
  • R 中的广义降梯度 (GRG2) 算法

    有谁知道哪个R包实现了广义降低梯度 GRG2 算法 谢谢 由于 BenBolker 已经完成了初步的工作来寻找您希望复制的功能类型 因此我发布了一个可能有用的后续内容 最近 Rhelp 上的一次交流以 R 提名的报价结束fortunes包裹
  • Android Espresso - 单击带有图像和文本的导航抽屉项目

    当导航抽屉由带有图像和文本视图的行列表组成时 如何单击导航抽屉项目 我使用了来自以下位置的 Espresso 测试源示例 git testapp test src main java com google android apps comm
  • 更新本地通知的开火日期并取消之前的通知

    我知道有几个问题here https stackoverflow com questions 5866146 remove a local notification from iphone by date and there https s
  • 如何获取主机的主IP地址?

    调用以下命令会返回所有 IP 地址的列表 Dns GetHostAddresses Dns GetHostName 有时 根据机器配置 可能会给您返回多个 IP 那么问题来了 如何确定哪个是主IP地址呢 您是否枚举了 NIC 不存在 主 I
  • 我们在 PHP 的 cURL 中使用 CURLOPT_WRITEFUNCTION 有何用处?

    您能用例子描述一下吗 我知道这是一个老问题 但也许我的回答会对您或其他人有所帮助 WRITEFUNCTION 对于处理流入的文本或根据某些条件中止下载非常有用 这是一个简单地将所有文本转换为大写字母的示例 function get html
  • 通过限制性出站防火墙建立 TCP 连接

    我正在使用 Java 创建一个使用 TCP 进行通信的客户端 服务器应用程序 客户端运行的网络具有出站防火墙 可阻止客户端连接到服务器 有什么方法 解决方法可以通过此防火墙创建 TCP 连接吗 我尝试使用开放的常见端口 例如端口 80 44
  • 使用尾递归实现javascript函数

    我有一个代表树的平面数组 我想使用尾递归构建一个嵌套对象 我有以下代码可以运行并生成所需的输出 但我不确定它是否是尾递归的正确实现 请指教 const myArray id root id 0 parent root id 1 parent
  • NuGet Pack - 针对 nuspec 或 csproj 打包的不同问题

    我在这里遇到了第 22 条军规 我正在使用 NuGet 和 TeamCity 我试过做NuGet pack使用 nuspec 文件 我也尝试过使用 csproj 文件 每个人都有自己的问题 在 TeamCity 中 如果我使用nuspec文
  • 节点高速通道-会话管理

    我为 ArangoDB for ConnectJS 编写了一个会话存储驱动程序 它正在工作 尽管仍处于 alpha 阶段 但我有几个问题 过期属性为 false 的第一个会话仅在用户代理的持续时间内保留 我注意到浏览器窗口关闭时不会调用 s