
JS
NestJS:如何注册瞬态和每个 Web 请求提供程序
在NestJS中,提供程序是应用程序的核心组件之一。它们用于处理各种任务,包括数据库访问、日志记录和服务之间的通信。在某些情况下,我们可能需要使用瞬态和每个Web请求提供程序来确保每个请求都有自己的实例。本文将介绍如何在NestJS中注册和使用这些提供程序,并提供示例代码。瞬态提供程序瞬态提供程序是一种特殊类型的提供程序,它们为每个请求创建一个新的实例。这意味着每个请求都有自己的实例,而不是共享一个实例。这在处理一些需要隔离的任务时非常有用。要注册瞬态提供程序,我们需要使用@Injectable()装饰器,并在提供者上添加{ scope: Scope.TRANSIENT }选项。下面是一个简单的例子:typescript@Injectable({ scope: Scope.TRANSIENT })class ExampleTransientProvider { private readonly id: number; constructor() { this.id = Math.random(); } getId(): number { return this.id; }}在这个例子中,我们创建了一个名为ExampleTransientProvider的瞬态提供程序。它具有一个私有属性id,并在构造函数中初始化为一个随机数。getId()方法返回该随机数。每个Web请求提供程序每个Web请求提供程序是另一种特殊类型的提供程序,它们为每个传入的HTTP请求创建一个新的实例。这对于处理与请求相关的任务非常有用,例如身份验证或请求特定的数据。要注册每个Web请求提供程序,我们需要使用@Injectable()装饰器,并在提供者上添加{ scope: Scope.REQUEST }选项。下面是一个简单的例子:typescript@Injectable({ scope: Scope.REQUEST })class ExampleRequestProvider { private readonly requestId: string; constructor(private readonly request: Request) { this.requestId = request.headers['request-id']; } getRequestId(): string { return this.requestId; }}在这个例子中,我们创建了一个名为ExampleRequestProvider的每个Web请求提供程序。它具有一个私有属性requestId,并在构造函数中从传入的Request对象中获取request-id头的值。getRequestId()方法返回该值。在NestJS应用程序中使用瞬态和每个Web请求提供程序要在NestJS应用程序中使用瞬态和每个Web请求提供程序,我们需要将它们添加到模块的提供者列表中。下面是一个简单的示例:typescript@Module({ providers: [ ExampleTransientProvider, ExampleRequestProvider, ], controllers: [AppController],})export class AppModule {}在这个示例中,我们将ExampleTransientProvider和ExampleRequestProvider添加到了AppModule的提供者列表中。这意味着它们现在可以在整个应用程序中使用。示例应用程序中的使用案例假设我们正在构建一个电子商务应用程序,并且需要为每个请求创建一个唯一的购物车实例。我们可以使用每个Web请求提供程序来实现这一点。下面是一个简化的示例:typescript@Injectable({ scope: Scope.REQUEST })class ShoppingCartProvider { private readonly cartId: string; constructor(private readonly request: Request) { this.cartId = request.session.cartId || this.generateCartId(); request.session.cartId = this.cartId; } private generateCartId(): string { // 生成唯一的购物车ID } getcartId(): string { return this.cartId; }}@Controller('cart')class ShoppingCartController { constructor(private readonly cartProvider: ShoppingCartProvider) {} @Get() getcartId(): string { return this.cartProvider.getcartId(); }}在这个示例中,我们创建了一个名为ShoppingCartProvider的每个Web请求提供程序。它使用session对象来存储和检索购物车ID。如果会话中不存在购物车ID,则会生成一个新的唯一ID,并将其存储在会话中。getcartId()方法返回购物车ID。ShoppingCartController是一个简单的控制器,它使用ShoppingCartProvider来获取当前请求的购物车ID。当我们向/cart路径发出GET请求时,它将返回购物车ID。在本文中,我们学习了如何在NestJS中注册和使用瞬态和每个Web请求提供程序。瞬态提供程序为每个请求创建一个新的实例,而每个Web请求提供程序为每个传入的HTTP请求创建一个新的实例。我们还提供了一个示例应用程序,展示了如何在购物车中使用每个Web请求提供程序来创建唯一的实例。这些功能使我们能够更好地控制和管理我们的NestJS应用程序中的实例。在 NestJS 中注册瞬态和每个 Web 请求提供程序可以通过使用 @Injectable 装饰器和设置适当的生命周期来实现。对于瞬态提供程序,可以使用 scope: Scope.TRANSIENT } 设置;对于每个 Web 请求的提供程序,可以使用 scope: Scope.REQUEST } 设置。
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号