我如果想以以下的方式去使用 LoggerService ,并且需要传递参数,是不是只能在 module 文件里面 provide 使用 useValue 。
因为我已经把 Logger 设置成了全局模块了,感觉要是继续在 provide 使用 useValue 就感觉没做全局一样,有没有其它方式能处理这个传参,比如使用个注解之类的,有没有比较好的方法?
我就暑假这两天看了一下 nestjs 的文档,想看看上面的问题能不能就使用 nest 的一些特性去解决,有大佬给个思路也行
// user.service.ts
@Injectable()
export class UserService {
constructor(private readonly logger: LoggerService) {}
}
// user.module.ts
@Module({
controllers: [UserController],
providers: [
UserService,
{
provide: LoggerService,
useValue: new LoggerService('user'),
},
],
})
export class UserModule {}
// src/app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
import { UserModule } from './user/user.module'
import { LoggerModule } from './libs/logger/logger.module'
@Module({
imports: [UserModule, LoggerModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
// src/libs/logger/logger.module.ts
import { Global, Module } from '@nestjs/common'
import { LoggerService } from './logger.service'
@Global()
@Module({
providers: [LoggerService],
exports: [LoggerService],
})
export class LoggerModule {}
// src/libs/logger/logger.service.ts
import { ConsoleLogger, Injectable, Scope } from '@nestjs/common'
import { Signale } from 'signale'
@Injectable({ scope: Scope.TRANSIENT })
export class LoggerService extends ConsoleLogger {
private readonly logger: Signale
private readonly scope: string
constructor(scope = 'app') {
super()
this.logger = new Signale({
stream: process.stdout,
disabled: false,
interactive: false,
})
this.scope = scope
this.logger.scope(this.scope)
this.logger.config({
displayTimestamp: true, // 以 HH:MM:SS 的格式显示当前本地时间。
displayDate: true, // 以 YYYY-MM-DD 的格式显示当前本地日期。
displayFilename: false, // 显示记录器消息来源的文件名。
})
}
complete(message: string, ...args: any[]) {
this.logger.complete(message, ...args)
}
}