[NestJS 带你飞!] DAY07 - Provider (下)

汇出自订 Provider

在介绍共享模组的时候,有提到可以透过 Module 的 exports 将 Provider 汇出,那自订 Provider 要如何汇出呢?这部分可以透过一些小技巧来达成。先建立一个 HandsomeModule 来做测试:

$ nest generate module handsome

接着,我们把 Custom Provider 的 展开式用变数储存起来,再将该展开式放到 providersexports 中:

import { Module } from '@nestjs/common';

const HANDSOME_HAO = {
  provide: 'HANDSOME_MAN',
  useValue: {
    name: 'HAO'
  }
};

@Module({
  providers: [
    HANDSOME_HAO
  ],
  exports: [
    HANDSOME_HAO
  ]
})
export class HandsomeModule {}

AppModule 进行汇入,下方为 app.module.ts 的范例:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { HandsomeModule } from './handsome/handsome.module';

@Module({
  imports: [HandsomeModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

修改 app.controller.ts 查看结果,会在终端机看到:

{ name: 'HAO' }

非同步 Provider

有时候可能需要等待某些非同步的操作来建立 Provider,比如:需要与资料库连线,Nest App 会等待该 Provider 建立完成才正式启动。这边以上方的范例来做修改,调整一下 handsome.module.ts 的内容:

import { Module } from '@nestjs/common';

const HANDSOME_HAO = {
  provide: 'HANDSOME_MAN',
  useFactory: async () => {
    const getHAO = new Promise(resolve => {
      setTimeout(() => resolve({ name: 'HAO' }), 2000);
    });
    const HAO = await getHAO;
    return HAO;
  }
};

@Module({
  providers: [
    HANDSOME_HAO
  ],
  exports: [
    HANDSOME_HAO
  ]
})
export class HandsomeModule {}

在等待两秒後,终端机会出现下方结果:

{ name: 'HAO' }

自选式 Provider

有时候可能会有 Provider 没有被提供但却注入的情况,这样在启动时会报错,因为 Nest 找不到对应的 Provider,那遇到这种情况该如何处理呢?首先,遇到这类型情况通常会给个预设值代替没被注入的 Provider,然後要在注入的地方添加 @Optional 装饰器。这里我们同样沿用上方范例,去修改 app.module.ts 的内容,将 HandsomeModule 移除汇入:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

接着去修改 app.controller.ts 的内容,替 HANDSOME_MAN 给定预设值:

import { Controller, Get, Inject, Optional } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Optional() @Inject('HANDSOME_MAN') private readonly handsomeMan = { name: '' }
    ) {
      console.log(this.handsomeMan);
  }

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

此时的终端机会显示结果:

{ name: '' }

小结

今天的内容主要是针对 Provider 的一些小技巧做介绍,下方为懒人包:

  1. 自订 Provider 可以透过把展开式抽离至变数来进行汇出。
  2. Provider 支援非同步建立,在尚未建立完 Provider 以前,Nest App 不会正式启动。
  3. 如果 Provider 并不是必须项目,必须在注入的地方添加 @Optional,这边也建议替该参数设置预设值。

在了解完 Nest 铁三角之後,就可以开始介绍一些其他的功能了!那就明天见罗!


<<:  Day22 ( 游戏设计 ) 小玛莉游戏机

>>:  Day22 火焰文字

【Day23】计数器减号按纽及测试小练习,先别偷看解答R ~ (⁎˃ᆺ˂)

这篇要来个小小练习,增加一个减号的按钮,并针对其结果作一个单元测试。 先别往下看,给自己五到十分钟....

Station list screen (1)

最近两篇都是讲 navigation component,入面为了示范设定 navigation 我...

背包系统详解

//装备药水:实现药水单向(若装备栏内没药水可直接装备)、双向置换(若装备栏内已经有药水,直接点击新...

Python 练习

今天我们要来做个小练习,因为比较基础的语法也都交给大家了,我们已经可以用那些语法来解决一些数学问题了...