类:AsyncLocalStorage


\Class: AsyncLocalStorage

版本历史
版本变更
v16.4.0

AsyncLocalStorage 现在稳定了。以前,它是实验性的。

v13.10.0, v12.17.0

新增于: v13.10.0, v12.17.0

此类创建通过异步操作保持一致的存储。

\This class creates stores that stay coherent through asynchronous operations.

虽然你可以在 node:async_hooks 模块之上创建自己的实现,但 AsyncLocalStorage 应该是首选,因为它是一种高性能且内存安全的实现,涉及实现起来并不明显的重要优化。

\While you can create your own implementation on top of the node:async_hooks module, AsyncLocalStorage should be preferred as it is a performant and memory safe implementation that involves significant optimizations that are non-obvious to implement.

以下示例使用 AsyncLocalStorage 构建一个简单的日志器,它为传入的 HTTP 请求分配 ID,并将它们包含在每个请求中记录的消息中。

\The following example uses AsyncLocalStorage to build a simple logger that assigns IDs to incoming HTTP requests and includes them in messages logged within each request.

import http from 'node:http';
import { AsyncLocalStorage } from 'node:async_hooks';
const asyncLocalStorage = new AsyncLocalStorage();
function logWithId(msg) {
 const id = asyncLocalStorage.getStore();
 console.log(`${id !== undefined ? id : '-'}:`, msg);
}
let idSeq = 0;
http.createServer((req, res) => {
 asyncLocalStorage.run(idSeq++, () => {
 logWithId('start');
 // Imagine any chain of async operations here
 setImmediate(() => {
 logWithId('finish');
 res.end();
 });
 });
}).listen(8080);
http.get('http://localhost:8080');
http.get('http://localhost:8080');
// Prints:
// 0: start
// 0: finish
// 1: start
// 1: finishconst http = require('node:http');
const { AsyncLocalStorage } = require('node:async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function logWithId(msg) {
 const id = asyncLocalStorage.getStore();
 console.log(`${id !== undefined ? id : '-'}:`, msg);
}
let idSeq = 0;
http.createServer((req, res) => {
 asyncLocalStorage.run(idSeq++, () => {
 logWithId('start');
 // Imagine any chain of async operations here
 setImmediate(() => {
 logWithId('finish');
 res.end();
 });
 });
}).listen(8080);
http.get('http://localhost:8080');
http.get('http://localhost:8080');
// Prints:
// 0: start
// 0: finish
// 1: start
// 1: finish

AsyncLocalStorage 的每个实例都维护一个独立的存储上下文。多个实例可以安全地同时存在,而不会有干扰彼此数据的风险。

\Each instance of AsyncLocalStorage maintains an independent storage context. Multiple instances can safely exist simultaneously without risk of interfering with each other's data.

AltStyle によって変換されたページ (->オリジナル) /