我正在使用Express,每次使用日志调试和跟踪我的应用程序时,我都需要访问请求中的一些数据(标题,cookie等)。
使用其他语言(即:Java)我有“线程上下文”,我可以放置该数据,因此每当我记录某些内容时都可以访问它。但据我所知,使用NodeJS并没有这样的事情,因为我们只有一个线程。
我试图避免在每个函数中传递req
变量,以便我可以记录该信息。
是否有节点或快递功能让我可以在任何地方获取数据?
答案 0 :(得分:12)
看看Continuation Local Storage,它实现类似于异步调用链的线程上下文的内容:https://github.com/othiym23/node-continuation-local-storage
此外,还努力将异步本地存储作为标准化功能构建到javascript本身,但它们仍处于初期阶段:TC39区域提案https://docs.google.com/presentation/d/1H3E2ToJ8VHgZS8eS6bRv-vg5OksObj5wv6gyzJJwOK0
答案 1 :(得分:-3)
JavaScript是单线程的这一事实不是一个限制,也不会阻止使用"线程上下文"作为一种使用普遍可及的状态的手段"。一旦进行异步调用并且状态不再与您想要的状态匹配,问题就会开始。
这是全球国家被考虑的原因之一"坏习惯"你应该瞄准避免它(在JavaScript和/或节点开发时不是特别......)。
相反,应该传递一个对象,而不是req
。您应该构建对象或调用函数,以便传递与每个调用链相关的log
实例(从请求事件开始并通过所有内部调用)。应该使用记录所需的任何上下文来初始化log
实例,并且在您的情况下,来自原始req
的请求详细信息。