【发布时间】:2016-04-06 00:40:57
【问题描述】:
我正在使用 Express,每次使用日志调试和跟踪我的应用程序时,我都需要访问请求中的一些数据(标头、cookie 等)。
对于其他语言(即:Java),我有“线程上下文”,我可以在其中放置数据,因此每当我记录某些内容时都可以访问它。但据我所知,NodeJS 没有这样的事情,因为我们只有一个线程。
我试图避免在每个函数中传递 req 变量,以便我可以记录该信息。
是否有节点或 expressjs 功能可以让我在任何地方获取数据?
【问题讨论】:
-
有模块——但老实说隐式请求全局变量很糟糕,你应该尽可能地避免它们。只有您的路由处理程序本身应该访问请求,然后只将相关位传递给需要它们的部分。
-
@Amit 这是一个合法的问题 - 我想可以通过删除“是否有模块”的部分并将其保留为“是否有快速或节点功能”来编辑它以使其更合法"
-
@BenjaminGruenbaum 我明白你的意思,但是为我的所有函数添加一个额外的参数以访问仅与日志记录相关的数据也是不好的
-
@Neuquino 你是对的,你应该将日志功能注入到负责日志记录的组件中——然后将记录器传递给使用它的函数。如果您不想将它传递给所有对象 - 将它们放在类中并将其传递给类的构造函数。这种模式(依赖注入)在现代软件设计中是通用的——您可以使用注入器自动但明确地传递记录器。不受控制的全局状态是可怕的:)
-
@BenjaminGruenbaum Java 和 C# 中的线程局部变量不是“不受控制的全局状态”。它们对于每个线程都是本地的,当涉及到与特定调用链相关的收集状态时,只要程序逻辑由调用函数的函数组成,我看不出如何用依赖注入替换它们?在某些用例中需要它们,并且存在像 Continuation Local Storage 这样的库是有原因的。