javascript - NodeJS - 将每个 HTTP 请求的 session 数据存储在 "global"变量中

标签 javascript node.js session express

有一个类似的线程是 currently two years old ,它几乎概括了我想要的。

举个例子,对于 C# 开发人员来说,有一个 Session 对象,它存储用户的 session ,并且可以在任何地方访问,在每个类 .dll 中,您可以命名它。它是根据请求存储的。

我需要基本上相同的东西。我的用户拥有简单的权限,他们要么是管理员,要么拥有大约 5 个分配的元素。我将这 5 个元素存储在访问 token 中,因此基本上在第一个中间件中,我有一个 id 数组,它们是用户的权限。

我想要的不是通过 permissions周围的对象,尤其是不要将它们传递给负责查询数据库的服务/DAL 层,因为这对于 getAllCities 来说非常荒谬。接收函数permissions对象和回调作为参数。或者任何与此相关的对象。

我无法将值存储在全局变量中,因为全局变量是全局的。我不想将变量传递给每个函数,因此我可能会回退到对每个调用的用户权限进行数据库四舍五入,但这只是......嗯。

我也不想过多地处理数十个库等,因为我相信这是人们偶然发现的常见问题,我想知道最好的解决方案是什么。

在上面链接的线程中有一个强大的解决方案,坦率地说我想避免。我在 Node 中使用的所有东西都是即插即用的,为这个“小”东西实现自定义中间件和管道似乎有些过分了。

两年后,这个问题有更好的解决方案吗?

最佳答案

您通常会使用类似express-session的东西来管理每个用户的 session ,然后每个传入的请求将自动在请求处理程序中访问该用户的 session 对象。然后,您可以在该 session 对象中存储任何特定于用户的信息。

您想要在给定请求中执行的任何函数都应该传递请求对象(从中可以访问 session ),或者只传递 session 对象或您从请求中提取的某些特定于用户的对象。 session 。在 Node.js 中,用户特定信息的位置位于请求对象中。没有“全局”空间来存储它以便所有其他函数都可以访问它。

如果您希望函数能够访问请求或 session 特定数据,则将该数据传递给该函数。这就是它的工作原理。如果这对您来说是一个问题,那么您必须重新思考代码的架构方式,也许使用可以更轻松地维护状态的对象/方法。

node.js 没有为每个请求提供一个可以拥有自己线程状态的线程。相反,在 http 服务器中,您使用请求对象作为给定请求的核心状态,并将其传递给需要它的函数。或者,如果您使用用户 session ,则可以从请求对象中提取该 session ,然后根据需要传递 session 。

I don't want to pass the variables to each function, so I would probably fall back to rounding the databases for user's permissions per each call, but that's just.. Meh.

在我看来,您的太多代码只是简单的函数,而不是对象上的方法。如果您将代码视为具有方法的用户对象,那么您可以在初始请求中形成一个用户对象,然后调用该用户对象上的方法来执行您想要执行的大多数特定于用户的操作。用户对象是一个很好的简单存储库,用于存储特定于用户的信息(例如权限),并且该对象上的所有方法都可以访问它,而不必将其传递给每个函数。

我再说一遍,如果传递用户状态看起来像是一种负担,那么可能是因为您的代码的架构没有使其变得简单。您应该考虑构建代码以使这些事情变得简单,而不是寻找非 Node.js 工作方式的解决方法,以便您的架构更紧密地匹配代码的需求(考虑到底层的方式)系统工作正常。

implementing custom middlewares and pipelines for this "small" thing seems like an overkill.

session 中间件可不是小东西。它是任何跨请求维护用户特定数据并希望在同一用户的每个新请求上轻松访问这些数据的应用程序的核心。这通常是在 Node.js 中管理用户状态的方式。

To give you an example, for the C# developers there is a single Session object which stores user's session and is accessible anywhere, in each class, .dll, you name it. It's stored per-request.

这根本不是node.js 在最低架构级别的工作方式。而且,您越早意识到这一点并开始设计代码以使其与 Node.js 实际工作方式(而不是其他系统的工作方式)保持一致,您就会越早发现 Node.js 编码流程自然。这是需要学习的新东西,不能回避或解决。

关于javascript - NodeJS - 将每个 HTTP 请求的 session 数据存储在 "global"变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920956/

相关文章:

Node.js 将 HTML 作为响应发送给客户端

node.js - 更改文件时如何使用nodemon在npm脚本上重新启动多个服务器文件

从 Word 文档打开页面时 PHP session 未注册

php - 在 PHP 中使用 header 传递 GET 变量

javascript - 如何将字典数组转换为数组数组?

javascript - || (或)JavaScript 中的 if 语句不起作用

javascript - 在 JavaScript 中从多维数组获取数组值

javascript - jquery文件上传取消所有上传

node.js - 从 cmd 运行 Protractor 与 npm run script 的结果差异

PHP - 每个选项卡的 session