NestJS:如何注册瞬态和每个 Web 请求提供程序

typescriptJS

2个回答

写回答

thisnow

2025-09-17 18:45

+ 关注

JS
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 {}

在这个示例中,我们将ExampleTransientProviderExampleRequestProvider添加到了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应用程序中的实例。

举报有用(4分享收藏

GcBrand

2025-09-20 15:49

+ 关注

在 NestJS 中注册瞬态和每个 Web 请求提供程序可以通过使用 @Injectable 装饰器和设置适当的生命周期来实现。对于瞬态提供程序,可以使用 scope: Scope.TRANSIENT } 设置;对于每个 Web 请求的提供程序,可以使用 scope: Scope.REQUEST } 设置。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号