是否有可能在Node中有"线程"局部变量?

Jop*_*ppe 14 node.js

我想存储一个在调用链中所有堆栈帧(自上而下)之间共享的变量.很像Java或C#中的ThreadLocal.

我找到了https://github.com/othiym23/node-continuation-local-storage但它一直在丢失所有用例的上下文,似乎你必须修补你正在使用的库,使其成为本地存储 -意识到我们的代码库或多或少是不可能的.

Node中确实没有其他可用选项吗?可以使用域,堆栈跟踪或类似的东西来获取当前调用链的句柄(id).如果这是可能的,我可以编写自己的线程本地实现.

Jak*_*olý 13

对的,这是可能的.Thomas Watson在2016年奥斯陆NodeConf上发表了他的Instrumenting Node.js in Production

它使用Node.js跟踪 - AsyncWrap(最终应该成为公共Node API中公认的部分).您可以在开源Opbeat Node代理中看到一个示例,或者更好的是查看谈话幻灯片和示例代码.

  • @Andy我实际上放弃了这个,因为我最初收到的所有答案都没有回答真正的问题,而是告诉我传递一个上下文对象(以新的巧妙方式顺便提交).自Jakub发布这篇文章以来,没有对此进行过调查,但如果继续本地存储已经将基础技术改为更可靠的话,这听起来真的很有希望.也许是时候再试一次. (2认同)

Jop*_*ppe 8

现在距离我最初提出这个问题已经过去了一年多,看起来我们终于有了一个在 Node.js 8 中采用异步钩子形式的可行解决方案。

https://nodejs.org/api/async_hooks.html

该 API 仍处于试验阶段,但即便如此,看起来已经有一个 Continuation-Local-Storage 的分支在内部使用这个新 API。

https://www.npmjs.com/package/cls-hooked