问题标签 [async-hooks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
149 浏览

node.js - 使用 cls-hooked 时元数据错误

我有一个连接到 MQTT 的应用程序,我想发布 1200 个设备,每个设备的 id 作为元数据。以下是代码

输出如下:

如您所见,1165 首次发布日志的元数据是正确的,但是一旦迭代中断并且函数变得异步,则首次发布的元数据将不匹配。

有没有办法来解决这个问题?

0 投票
1 回答
242 浏览

javascript - Deno 有办法跟踪异步上下文吗?

广义地说,在 NodeJS 中,每当代码运行时,程序都会创建“异步上下文”,通过事件循环或微任务队列创建稍后运行的回调。网络请求、setTimeout回调、Promise 等。

在 NodeJs 的现代版本中,您拥有(仍处于试验阶段)async_hooks模块来跟踪这些异步资源的生命周期。

以前的 NodeJS 版本现在已弃用-polyfill 包process.addAsyncListener保持活动状态。async-listener

Deno 是否有任何内置或第三方功能允许用户态代码跟踪这些异步上下文的创建?或者 Deno 的工作原理是否使这个概念变得无关紧要?

0 投票
0 回答
134 浏览

javascript - 包裹在共享库中的 cls-hooked 不起作用

我正在我的 node.js 项目(monorepo)中进行请求跟踪,并发现了一个名为“cls-hooked”的东西,它使用了异步钩子。因此,我只是将 cls-hooked 功能包装到适配器中,然后将其放入我在每个微服务中使用的共享库中。问题是在启动此类服务时:

当我将适配器放入每个服务的代码中时 - 它就像一个魅力,但我不想在每个服务中复制这样的代码。有人能告诉我这个错误与异步钩子有关吗?是否甚至可以使用从 node_modules 加载的共享库中的异步挂钩功能或 cls 挂钩功能本身?

0 投票
0 回答
135 浏览

javascript - 为日志关联创建 TypeScript 类装饰器

我正在尝试创建一个可以添加到任何类的 TypeScript 装饰器,它将创建一个请求范围的上下文,我可以使用它来存储请求 ID。我遇到了几篇关于装饰器的文章,但似乎没有一个适合我的用例。

下面是我用来创建异步钩子、装饰器和应该被包装的示例类的代码。运行代码时,我收到的实际响应是一个空对象。上下文正在丢失,但我不知道为什么。我没有收到任何错误或警告。

任何建议将不胜感激。

这是我用来创建上下文的代码。调用initContext()getContext()函数。

这是我用来包装类的装饰器。我试图在函数的上下文中创建构造initContext函数,设置上下文 ID,然后返回新的构造函数。

这是一个应该能够生成上下文 ID 的示例类

0 投票
1 回答
1223 浏览

node.js - Nodejs AsyncLocalStorage getStore() 返回未定义

我读了这篇文章AsyncLocalStorage for Easy Context Passing in Node.js 我尝试在我的日志中获取 logId,但我不能,因为asyncLocalStorage.getStore()返回未定义。似乎在 MyLogger 类中丢失了上下文。如何解决?

这是我的快递应用

这是 MyLogger 类

0 投票
0 回答
302 浏览

node.js - AsyncLocalStorage 不会跨 Promise 链传播?

考虑以下代码在 Windows 上的 NodeJS 14.4 下运行:

我预计第二个承诺的本地存储会传播到第三个承诺。但是,此代码的输出如下:

如果我通过async-local-storage打开调试,则会显示以下输出:

我是否错过了期望商店也传播到第三个承诺的东西?

0 投票
1 回答
204 浏览

node.js - 从异步钩子 HTTPINCOMINGMESSAGE 获取 HTTP 标头/正文

我正在尝试从IncomingMessage异步钩子提供的实例中获取 HTTP 标头和 HTTP 正文HTTPINCOMINGMESSAGE

我已经深入研究了 Node.js 源代码,但没有运气。我找不到填充的代码req.headers,也找不到创建 HTTP 正文流的代码。

编辑

总体目标是使通配符 API能够提供context

0 投票
0 回答
825 浏览

node.js - 使用 Async Hooks 的性能影响

我是 Node.js 库的作者,我想使用Async Hooks来改进 DX。但我担心性能。

我读过一些故事说一切都很好,也有一些故事说性能是一个障碍。

从理论上讲,异步应该只发生在 IO 操作中,性能惩罚应该几乎是 ~0。(因为 IO 操作比运行 JS 代码要贵几个数量级。)

但是,实际上,在每个异步调用上运行额外的 JS 是否会导致不可忽略的性能下降?

您对异步钩子的性能有何经验?

用例

具体用例是Wildcard API,我在其中使用 Async Hooks,它为 Wildcard 用户提供了出色的人体工程学:

感谢 Async Hooks,通配符context在 HTTP 请求的生命周期内的任何地方都可用(!)。

通配符的异步钩子代码很小,但会针对在 HTTP 请求上下文中发生的每个异步调用运行。

这里的主要危险是内存泄漏,但 Wildcard 的测试套件正在检查是否存在内存泄漏。

0 投票
0 回答
39 浏览

node.js - async_hooks - 为什么没有调用/清理资源

以下代码

打印以下标准输出:

问题:

  1. 什么是“4”?
  2. 什么是“TickObject”以及为什么在 Node.js 退出之前不清理“5”?
  3. console.log异步一样,我希望 async_hooks 将永远被调用。为什么我在输出中看不到无限递归?
0 投票
1 回答
246 浏览

javascript - nodejs 上的 async_hooks 和 Promise 之间的问题

我尝试async_hooks在 nodejs 中使用实验模块。

如果我尝试“版本 A”(带有 setTimout)我有这个输出:

但是,如果我尝试“版本 B”(带有承诺),我会得到以下输出:

第二个执行上下文附加到第一个执行上下文,因为“then”被附加在第一个上下文的承诺上。但这很成问题:我不能像 java 中的“ThreadLocal”那样使用它。你有解决方案吗?我可以创建第二个承诺来解决问题,但这对我来说不是一个可接受的解决方案。

问候。