async_hooks.executionAsyncResource()
- 返回: <Object> 代表当前执行的资源。 用于在资源中存储数据。
executionAsyncResource()
返回的资源对象通常是带有未记录 API 的内部 Node.js 句柄对象。
在对象上使用任何函数或属性都可能使您的应用程序崩溃,应该避免。
在顶层执行上下文中使用 executionAsyncResource()
将返回空的对象,因为没有要使用的句柄或请求对象,但是有一个代表顶层的对象可能会有所帮助。
const { open } = require('fs');
const { executionAsyncId, executionAsyncResource } = require('async_hooks');
console.log(executionAsyncId(), executionAsyncResource()); // 1 {}
open(__filename, 'r', (err, fd) => {
console.log(executionAsyncId(), executionAsyncResource()); // 7 FSReqWrap
});
这可用于实现连续本地存储,无需使用跟踪 Map
来存储元数据:
const { createServer } = require('http');
const {
executionAsyncId,
executionAsyncResource,
createHook
} = require('async_hooks');
const sym = Symbol('state'); // 避免污染的私有符号
createHook({
init(asyncId, type, triggerAsyncId, resource) {
const cr = executionAsyncResource();
if (cr) {
resource[sym] = cr[sym];
}
}
}).enable();
const server = createServer((req, res) => {
executionAsyncResource()[sym] = { state: req.url };
setTimeout(function() {
res.end(JSON.stringify(executionAsyncResource()[sym]));
}, 100);
}).listen(3000);