NodeJS - 将每个HTTP请求的会话数据存储在“全局”变量中

时间:2016-12-01 21:44:37

标签: javascript node.js session express

有一个类似的帖子是currently two years old,它几​​乎总结了我想要的东西。

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

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

我想要的不是传递permissions对象,特别是不要将它们传递给负责查询数据库的服务/ DAL层,因为getAllCities函数接收{非常荒谬} {1}}对象和回调作为参数。或者无论是什么对象。

我无法将值存储在全局变量中,因为全局变量是全局变量。我不想将变量传递给每个函数,所以我可能会回过头来围绕每个调用的用户权限舍入数据库,但那只是...... Meh。

我也不想在数十个图书馆等方面搞得太多,因为我认为这是一个人们偶然发现的常见问题,我想知道什么是最好的解决方案。

在上面链接的帖子中,有一个强有力的解决方案,我坦率地想要避免。我在Node中使用的所有东西都是即插即用的,为这个“小”的东西实现自定义中间件和管道似乎是一种过度杀伤力。

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

1 个答案:

答案 0 :(得分:1)

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

您希望在给定请求中执行的任何函数都应该传递给请求对象(他们可以从中访问会话),或者只传递会话对象或您从中拉出的某些特定于用户的对象。会话。在node.js中,用户特定信息的位置在请求对象中。没有"全球"用于存储所有其他功能可以访问它的空间。

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

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

  

我不想将变量传递给每个函数,所以我愿意   可能会回退到数据库的四舍五入以获得用户的权限   每次通话,但那只是......嗯。

听起来我觉得你的代码太多只是简单的函数而不是对象的方法。如果您将代码视为具有方法的用户对象,那么您可以在初始请求中形成用户对象,然后在该用户对象上调用方法,以获取您希望用户特定的大多数事情。用户对象是一个很好的简单存储库,用于特定于用户的信息(例如权限),对象上的所有方法都可以访问它,而不必将其传递给每个函数。

我再说一遍,如果传递用户状态似乎是一种负担,那么可能是因为你的代码没有以易于使用的方式构建。你应该考虑构建代码以使这些事情变得简单,而不是寻找解决方案而不是node.js的工作方式,这样你的架构就能更好地匹配代码的需求。系统工作。

  

为此"小"实现自定义中间件和管道。事情   好像太过分了。

会话中间件不是一件小事。它是任何跨请求维护用户特定数据的应用程序的核心,并希望在同一用户的每个新请求上轻松访问它。它通常是如何在node.js中管理用户状态的。

  

举个例子,对于C#开发人员来说,只有一个   会话对象,存储用户的会话,可以在任何地方访问,   在每个类中,.dll,你的名字。它按请求存储。

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