在介绍共享模组的时候,有提到可以透过 Module 的 exports
将 Provider 汇出,那自订 Provider 要如何汇出呢?这部分可以透过一些小技巧来达成。先建立一个 HandsomeModule
来做测试:
$ nest generate module handsome
接着,我们把 Custom Provider 的 展开式用变数储存起来,再将该展开式放到 providers
与 exports
中:
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,比如:需要与资料库连线,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 没有被提供但却注入的情况,这样在启动时会报错,因为 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 的一些小技巧做介绍,下方为懒人包:
@Optional
,这边也建议替该参数设置预设值。在了解完 Nest 铁三角之後,就可以开始介绍一些其他的功能了!那就明天见罗!
这篇要来个小小练习,增加一个减号的按钮,并针对其结果作一个单元测试。 先别往下看,给自己五到十分钟....
最近两篇都是讲 navigation component,入面为了示范设定 navigation 我...
//装备药水:实现药水单向(若装备栏内没药水可直接装备)、双向置换(若装备栏内已经有药水,直接点击新...
Ebury 於 2009 年在伦敦成立,现已成为欧洲规模最大、资金最雄厚的金融科技公司之一,在全球 ...
今天我们要来做个小练习,因为比较基础的语法也都交给大家了,我们已经可以用那些语法来解决一些数学问题了...