NestJS 中如何便捷的动态设置自定义日志函数的 作用域参数

查看 109|回复 1
作者:NorthA   
问一下各位大佬
我如果想以以下的方式去使用 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)
        }
}

import, logger, scope, from

NorthA
OP
  
总感觉要是写一个模块,就得 provide 一次,那 100 个 service 就得导入 100 次,这种比较重复性的工作感觉没必要
不传参,暴露一个方法去动态设置也行,不过我就是想知道 nestjs 有没有什么特性能解决这个问题,毕竟初学想了解一下😊
您需要登录后才可以回帖 登录 | 立即注册

返回顶部