NestJS中利用AsyncLocalStorage实现请求级别的依赖注入
13
0
0
0
什么是AsyncLocalStorage?
如何在NestJS中使用AsyncLocalStorage?
1. 初始化AsyncLocalStorage实例
2. 创建中间件来初始化上下文
在NestJS开发中,依赖注入(DI)是其核心特性之一。它帮助我们轻松管理应用中的各个组件及其依赖关系。然而,默认情况下,NestJS的依赖注入是基于单例模式的,这意味着所有请求共享同一个实例。在某些场景下,我们需要为每个请求创建独立的上下文环境,例如用户认证、多租户隔离等。这时,AsyncLocalStorage
便成为了一个强大的工具。
什么是AsyncLocalStorage?
AsyncLocalStorage
是Node.js提供的一个API,用于在异步操作中存储和传递上下文数据。它允许我们在异步调用链中共享数据,而无需显式地传递参数。对于NestJS来说,这为实现请求级别的依赖注入提供了可能。
如何在NestJS中使用AsyncLocalStorage?
1. 初始化AsyncLocalStorage实例
首先,我们需要创建一个全局的AsyncLocalStorage
实例:
import { AsyncLocalStorage } from 'async_hooks'; export const asyncLocalStorage = new AsyncLocalStorage<Map<string, any>>();
这里我们使用了一个Map
来存储每个请求的上下文数据。
2. 创建中间件来初始化上下文
接下来,我们可以编写一个中间件来为每个请求初始化上下文:
import { Injectable, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; import { asyncLocalStorage } from './async-local-storage'; @Injectable() export class AsyncContextMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { const context = new Map(); // 创建一个新的Map作为当前请求的上下文 asyncLoca..