Nest 无法解析依赖关系 LogService(?,LogFormatProvider)。请参数索引 [0] 处的字符串在 AppModule 上下文中可用


My app.module.ts file looks like this:
import { Module, HttpModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { join } from 'path';
import { LaunchService } from './launch/launch.service';
import { LaunchResolver } from './launch/launch.resolver';
import { LaunchModule } from './launch/launch.module';
import { LogService } from '@fmr-pr103625/nest-scaffold';
@Module({
imports: [
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
typePaths: ['./**/*.graphql'],
definitions: { path: join(process.cwd(), 'src/graphql.ts') },
}),
HttpModule,
LaunchModule,
],
controllers: [AppController],
providers: [AppService, LaunchService, LaunchResolver, LogService],
})
export class AppModule {}

My app.service.ts file looks like this:
import { Injectable } from '@nestjs/common';
import { Logger, LogService } from '@fmr-pr103625/nest-scaffold';
@Injectable()
export class AppService {
@Logger()
private logger: LogService;
getHello(): string {
this.logger.error('Hello');
return 'Hello World!';
}
}

I am trying to use the in built logservice from another repo but this error is coming while running the file.
Nest can't resolve dependencies of the LogService (?, LogFormatProvider). Please make sure that the argument String at index [0] is available in the AppModule context.
Potential solutions:
- If String is a provider, is it part of the current AppModule?
- If String is exported from a separate @Module, is that module imported within AppModule?
@Module({
imports: [ /* the Module containing String */ ]
})

---------------------------**********************---------------------------------

让我知道我错过了什么,我如何解决这个问题。我只是在检查简单的LogService。

--------------------------**********************-----------------------------------

日志服务如下所示:

Object.defineProperty(exports, "__esModule", { value: true });
exports.LogService = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const winston = require("winston");
const log_level_1 = require("../constants/log-level");
const log_format_service_1 = require("./log-format.service");
const Console = winston.transports.Console;
let LogService = class LogService {
constructor(category, formatProvider) {
this.category = category;
this.formatProvider = formatProvider;
this.level = log_level_1.LogLevel.info;
this.logger = winston.createLogger({
level: this.level,
format: this.formatProvider.createFormat(this.category),
transports: [new Console()],
});
}
info(message, ...meta) {
this.log(log_level_1.LogLevel.info, message, ...meta);
}
error(message, ...meta) {
this.log(log_level_1.LogLevel.error, this.addingSplit(meta, message), ...meta);
}
warn(message, ...meta) {
this.log(log_level_1.LogLevel.warn, message, ...meta);
}
debug(message, ...meta) {
this.log(log_level_1.LogLevel.debug, message, ...meta);
}
log(level, message, ...meta) {
this.syncProps();
if (this.isLevelEnabled(level))
this.logger.log(level, message, ...meta);
}
isLevelEnabled(loggingLevel) {
return this.logger.levels[this.level] >= this.logger.levels[loggingLevel];
}
syncProps() {
this.logger.level = this.level;
}
addingSplit(meta, message) {
if (meta[0] instanceof Error && meta[0].message) {
message = message + ", errorMessage:";
}
return message;
}
};
tslib_1.__decorate([
config_core_1.Prop(),
tslib_1.__metadata("design:type", String)
], LogService.prototype, "level", void 0);
LogService = tslib_1.__decorate([
common_1.Injectable(),
tslib_1.__metadata("design:paramtypes", [String, log_format_service_1.LogFormatProvider])
], LogService);
exports.LogService = LogService;

---------------------------*************************-------------------------------

错误信息Nest无法解析依赖项LogFormatProvider)。告诉您,您需要将字符串值作为第一个参数传递给LogService的构造函数。这将是类别参数。在注入过程中,它不知道应该为该参数提供什么。通常情况下,您会希望避免这样的构造函数设计,但如果需要,则需要允许提供默认值。(作为架构师/技术主管,我经常指导我的开发人员通过使用应用程序配置值来简化签名。)

让我们在单元测试环境中看看问题的原因,您应该能够复制并使用单元测试来帮助您解决问题。您将设置testingModule来为您提供注入支持,它可能看起来像这样:

testingModule = await Test.createTestingModule({
imports: [...],
providers: [LogService]
}).compile();
logService = testingModule.get(LogService);

注入器怎么知道你想为类别参数提供什么?这就是@Inject()装饰器可以提供帮助的地方。在构造函数中,添加@Inject('LOG_CATEGORY')category参数前面。这让注入器知道,当它实例化LogService时,你想通过名称"LOG_CATEGORY"提供一个值。

constructor(@Inject('LOG_CATEGORY') category: string, ...) {...}
现在让我们修改testingModule来提供一个值。在providers数组中,提供一个指定要使用的值的提供者。在下面的例子中,我想提供值"Default"
testingModule = await Test.createTestingModule({
imports: [...],
providers: [
LogService,
{
provide: 'LOG_CATEGORY',
useValue: 'Default'
}
]
}).compile();
logService = testingModule.get(LogService);

你选择如何解决这个问题取决于你,但我希望这能给你提供一些解决这个问题的方法。至少,它应该为您提供一个如何在单元测试中解决这种情况的示例。: D

最新更新