亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

NestJS開(kāi)發(fā)核心概念Providers類(lèi)基本用法詳解

 更新時(shí)間:2023年08月08日 09:55:46   作者:南玖  
這篇文章主要為大家介紹了NestJS開(kāi)發(fā)核心概念Providers類(lèi)基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

ProvidersNest中的一個(gè)基本概念,許多Nest中定義的類(lèi)都可以被視為一個(gè)Provider,比如:service、repository、factory、helper等,它們都可以通過(guò)constructor注入依賴(lài)關(guān)系,這就意味著類(lèi)與類(lèi)之間可以創(chuàng)建各種依賴(lài)關(guān)系,并且維護(hù)各個(gè)類(lèi)之間依賴(lài)關(guān)系的工作將委托給Nest運(yùn)行時(shí)系統(tǒng)。

Provider類(lèi)(service)基本用法

前面幾章我們通過(guò)nest-cli生成的代碼中就包含有service類(lèi)

比如:

// nanjiu.service.ts
import { Injectable } from '@nestjs/common';
import { CreateNanjiuDto } from './dto/create-nanjiu.dto';
import { UpdateNanjiuDto } from './dto/update-nanjiu.dto';
@Injectable()
export class NanjiuService {
  create(createNanjiuDto: CreateNanjiuDto) {
    return 'This action is nanjiu post';
  }
  findAll() {
    return `This action returns all nanjiu`;
  }
  findOne(id: number) {
    return `This action returns a #${id} nanjiu`;
  }
  update(id: number, updateNanjiuDto: UpdateNanjiuDto) {
    return `This action updates a #${id} nanjiu`;
  }
  remove(id: number) {
    return `This action removes a #${id} nanjiu`;
  }
}

使用步驟如下:

@Injectable()裝飾器

這里的NanjiuService類(lèi)通過(guò)@Injectable裝飾器標(biāo)記為一個(gè)provider,表明該類(lèi)可以被NestIOC容器管理

在module中注冊(cè)

服務(wù)需要在對(duì)應(yīng)的module中進(jìn)行注冊(cè),如果不注冊(cè)IOC容器是不會(huì)幫你創(chuàng)建對(duì)象的,而且還會(huì)報(bào)錯(cuò)

// nanjiu.module.ts
@Module({
  controllers: [NanjiuController],
  providers: [NanjiuService]
})
export class NanjiuModule {}

在controller中注入并使用

module中注冊(cè)service類(lèi)后,再通過(guò)controller的構(gòu)造函數(shù)進(jìn)行注入,那么該類(lèi)就可以在controller中去使用了

// nanjiu.controller.ts
@Controller('nanjiu')
export class NanjiuController {
  constructor(private readonly nanjiuService: NanjiuService) {}
  @Post()
  @Header('Cache-Control', 'none')
  create(@Body() createNanjiuDto: CreateNanjiuDto) {
    console.log('body', createNanjiuDto)
    return this.nanjiuService.create(createNanjiuDto);
  }
}

可以看到是通過(guò)類(lèi)構(gòu)造函數(shù) constructor(private readonly nanjiuService: NanjiuService) {}這種方式來(lái)進(jìn)行依賴(lài)注入的,Nest提供了IOC容器利用Typescript自帶類(lèi)型的特點(diǎn)自動(dòng)創(chuàng)建對(duì)象的能力,注意這里是單例模式,如果該Service在其它地方也被用過(guò),那么會(huì)在不會(huì)重新創(chuàng)建對(duì)象,各個(gè)應(yīng)用只會(huì)有一個(gè)該Service的對(duì)象,容器會(huì)先尋找當(dāng)前有沒(méi)有,如果沒(méi)有再進(jìn)行創(chuàng)建。

自定義Provider

Provider可以是一個(gè)值(value),也可以是一個(gè)類(lèi)(class),還可以是一個(gè)工廠函數(shù)(factory)

useClass

上面providers的那種寫(xiě)法其實(shí)是一種簡(jiǎn)寫(xiě),它的完整寫(xiě)法應(yīng)該是這樣:

// nanjiu.module.ts
@Module({
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴(lài)注入的標(biāo)識(shí)
    useClass: NanjiuService // 依賴(lài)注入的類(lèi)
  }]
})
export class NanjiuModule {}

完整寫(xiě)法可以通過(guò)provide屬性給不同的provider標(biāo)注不同的token

然后再controller中需要使用@Inject(對(duì)應(yīng)的token)進(jìn)行注入

// nanjiu.controller.ts
@Controller('nanjiu')
export class NanjiuController {
  constructor(@Inject('NANJIU') private readonly nanjiuService: NanjiuService) {}

  @Post()
  @Header('Cache-Control', 'none')
  create(@Body() createNanjiuDto: CreateNanjiuDto) {
    console.log('body', createNanjiuDto, this.nanjiuService)
    return true
    return this.nanjiuService.create(createNanjiuDto);
  }
}

useValue

還可以使用useValue自定義注入值

// nanjiu.module.ts
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴(lài)注入的標(biāo)識(shí)
    useValue: {
      name: 'nanjiu' // 依賴(lài)注入的值
    }
  }]
})

useFactory

工廠函數(shù)可以提供動(dòng)態(tài)的provider,由factory函數(shù)的返回值來(lái)確定,factory函數(shù)可以很簡(jiǎn)單也可以很復(fù)雜,它也可以使用其它provider,不過(guò)需要在inject屬性進(jìn)行注入,注入的provider可以是可選的

  • 工廠函數(shù)可以接受(可選)參數(shù)。
  • (可選)inject屬性接受一組提供程序,Nest 將在實(shí)例化過(guò)程中解析這些提供程序并將其作為參數(shù)傳遞給工廠函數(shù)。這兩個(gè)列表應(yīng)該是相關(guān)的:Nest 將以inject相同的順序?qū)⒘斜碇械膶?shí)例作為參數(shù)傳遞給工廠函數(shù)。
// nanjiu.module.ts
import { Module } from '@nestjs/common';
import { NanjiuService } from './nanjiu.service';
import { UserService } from 'src/user/user.service';
import { NanjiuController } from './nanjiu.controller';
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴(lài)注入的標(biāo)識(shí)
    useClass: NanjiuService // 依賴(lài)注入的類(lèi)
  },
  UserService,
  {
    provide: 'USER', // 自定義依賴(lài)注入的標(biāo)識(shí)
    useFactory: (...args) => { // 工廠模式
      console.log('useFactory', args)
      return new UserService() // 依賴(lài)注入的類(lèi)
    },
    inject: [UserService] // 依賴(lài)注入的類(lèi)
  }
]
})
export class NanjiuModule {}

可選的Provider

有時(shí)你可能存在不一定需要解決的依賴(lài)關(guān)系。例如,你的類(lèi)可能依賴(lài)于配置對(duì)象,但如果沒(méi)有傳遞任何內(nèi)容,則應(yīng)使用默認(rèn)值。在這種情況下,依賴(lài)關(guān)系變得可選,這時(shí)候可以給對(duì)應(yīng)的注入服務(wù)再增加一個(gè)@Optional()裝飾器就行

import { Injectable, Optional, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
  constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}

異步Provider

useFactory可以返回一個(gè)promise 或者其他異步操作,Nest 將在實(shí)例化任何依賴(lài)(注入)此類(lèi)提供程序的類(lèi)之前等待promise的結(jié)果。

// nanjiu.module.ts
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [
  UserService,
  {
    provide: 'USER', // 自定義依賴(lài)注入的標(biāo)識(shí)
    useFactory: async () => { // 工廠模式
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(new UserService())
        }, 1000)
      })
    },
    inject: [UserService] // 依賴(lài)注入的類(lèi)
  }
]
})
export class NanjiuModule {}

以上就是NestJS開(kāi)發(fā)核心概念Providers類(lèi)基本用法詳解的詳細(xì)內(nèi)容,更多關(guān)于NestJS核心Providers類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • node.js中的favicon.ico請(qǐng)求問(wèn)題處理

    node.js中的favicon.ico請(qǐng)求問(wèn)題處理

    本文記錄了在項(xiàng)目中使用node.js請(qǐng)求favican.ico的時(shí)候會(huì)出現(xiàn)2條請(qǐng)求,浪費(fèi)資源,經(jīng)過(guò)一番改進(jìn),記錄下來(lái)過(guò)程,以后注意。
    2014-12-12
  • Nodejs腳本實(shí)現(xiàn)批量修改文件

    Nodejs腳本實(shí)現(xiàn)批量修改文件

    當(dāng)我們想要更改一下所有的文件,如何可以在修改到這些文件的同時(shí)又能實(shí)現(xiàn)節(jié)省時(shí)間呢,通過(guò)這篇文章我們將來(lái)學(xué)習(xí)一下怎么通過(guò)這個(gè)腳本來(lái)實(shí)現(xiàn)這個(gè)功能,希望對(duì)大家有所幫助
    2023-11-11
  • node使用UEditor富文本編輯器的方法實(shí)例

    node使用UEditor富文本編輯器的方法實(shí)例

    本篇文章主要介紹了node使用UEditor富文本編輯器的方法實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • 基于node.js實(shí)現(xiàn)爬蟲(chóng)的講解

    基于node.js實(shí)現(xiàn)爬蟲(chóng)的講解

    今天小編就為大家分享一篇關(guān)于基于node.js實(shí)現(xiàn)爬蟲(chóng)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 關(guān)于npm install過(guò)程失敗的幾種處理方式

    關(guān)于npm install過(guò)程失敗的幾種處理方式

    這篇文章主要介紹了關(guān)于npm install過(guò)程失敗的幾種處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Nodejs本地部署DeepSeek的教程詳解

    Nodejs本地部署DeepSeek的教程詳解

    DeepSeek作為一款開(kāi)源且性能強(qiáng)大的大語(yǔ)言模型,提供了靈活的本地部署方案,讓用戶(hù)能夠在本地環(huán)境中高效運(yùn)行模型,同時(shí)保護(hù)數(shù)據(jù)隱私,本文主要為大家詳細(xì)介紹了Nodejs本地部署DeepSeek的相關(guān)知識(shí),需要的可以了解下
    2025-02-02
  • express+multer上傳圖片打開(kāi)亂碼問(wèn)題及解決

    express+multer上傳圖片打開(kāi)亂碼問(wèn)題及解決

    這篇文章主要介紹了express+multer上傳圖片打開(kāi)亂碼問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Node.js進(jìn)階之核心模塊https入門(mén)

    Node.js進(jìn)階之核心模塊https入門(mén)

    在nodejs中,提供了 https 這個(gè)模塊來(lái)完成 HTTPS 相關(guān)功能。這篇文章主要介紹了Node.js進(jìn)階之核心模塊https入門(mén),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 安裝 node-Sass 報(bào)錯(cuò)的解決記錄(三步解決法)

    安裝 node-Sass 報(bào)錯(cuò)的解決記錄(三步解決法)

    本文主要介紹了安裝 node-Sass 報(bào)錯(cuò)的解決記錄(三步解決法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Puppeteer前端自動(dòng)化測(cè)試實(shí)踐

    詳解Puppeteer前端自動(dòng)化測(cè)試實(shí)踐

    這篇文章主要介紹了詳解Puppeteer前端自動(dòng)化測(cè)試實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02

最新評(píng)論