如何监听 Node.js 中异步资源的生命周期?
Node.js 提供 async_hooks 模块来监听和跟踪异步资源的生命周期。通过注册钩子函数,可以捕捉到异步操作的不同阶段,如初始化、执行前后及销毁事件。这有助于开发者进行性能分析和资源监控。
Node.js 提供 async_hooks
模块来监听异步资源的生命周期。主要步骤如下:
- 引入 async_hooks 模块
const async_hooks = require('async_hooks');
- 注册生命周期钩子
通过createHook()
定义以下回调函数监听不同阶段:init
: 异步资源初始化时触发before
: 异步回调执行前触发after
: 异步回调执行后触发destroy
: 异步资源销毁时触发
- 示例代码
const fs = require('fs'); const asyncHook = async_hooks.createHook({ init(asyncId, type) { fs.writeSync(1, `[init] id: ${asyncId}, type: ${type}\n`); }, before(asyncId) { fs.writeSync(1, `[before] id: ${asyncId}\n`); }, after(asyncId) { fs.writeSync(1, `[after] id: ${asyncId}\n`); }, destroy(asyncId) { fs.writeSync(1, `[destroy] id: ${asyncId}\n`); } }); asyncHook.enable(); setTimeout(() => { console.log('异步操作完成'); }, 100);
- 输出结果分析
对于setTimeout
异步操作,会按顺序输出:[init] id: 6, type: Timeout // 初始化异步资源 [before] id: 6 // 执行回调前 异步操作完成 // 回调执行 [after] id: 6 // 执行回调后 [destroy] id: 6 // 资源销毁
- 注意事项
- ⚠️
async_hooks
属于实验性 API(Node.js v18+),生产环境需谨慎使用 - 需启用钩子:
asyncHook.enable()
- 支持异步资源类型包括
Timeout
、PROMISE
、TCPWRAP
等 - 可在回调中获取
asyncId
和资源类型type
用于追踪
- ⚠️
替代方案:使用 perf_hooks
模块分析异步操作耗时(适用于性能监控场景)。