【问题标题】:Dependency injection - app.get(UploadService) on INestApplication doesn't resolve its dependencies依赖注入 - INestApplication 上的 app.get(UploadService) 无法解决其依赖关系
【发布时间】:2019-11-25 23:56:47
【问题描述】:

我正在尝试创建使用我的 Nest 上下文的外部 CLI。我已经创建了入口点,它使用 NestFactory.create 创建应用程序。使用 app.get 访问服务后,服务存在并自行运行。问题是,它不能解决它的任何依赖关系。 Docs 上没有示例,我也没有在 Internet 上找到与此问题相关的任何内容。

我在 2019 年 7 月 17 日在节点 10 上使用最新版本的 Nest.js。

main.ts

import { NestFactory } from '@nestjs/core';

import { AppModule } from '../app.module';
import { UploadService } from 'src/api/upload/upload.service';
import { UploadModule } from 'src/api/upload/upload.module';

async function bootstrap(): Promise<void> {
  const app = await NestFactory.create(AppModule);
  await app.init();

  const service: UploadService = app.select(UploadModule).get(UploadService);

  console.log(service); // OK - returns UploadService instance
  console.log(service.uploadModel); // X - returns `undefined`
  console.log(service.configService); // X - returns `undefined`
}

bootstrap();

app.module.ts

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from './config/config.module';
import { ConfigService } from './config/config.service';
import { AwsModule } from './services/aws/aws.module';
import { UploadModule } from './api/upload/upload.module';

@Module({
  imports: [
    ConfigModule,
    MongooseModule.forRootAsync({
      useFactory: async (configService: ConfigService): Promise<object> => ({
        uri: configService.data.database.mongo.uri,
        useCreateIndex: true,
        useNewUrlParser: true,
      }),
      inject: [ConfigService],
    }),
    AwsModule,
    UploadModule,
  ],
})
export class AppModule {}

上传.module.ts

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { AwsModule } from '../../services/aws/aws.module';
import { UploadService } from './upload.service';
import { UploadSchema } from './upload.schema';

@Module({
  imports: [MongooseModule.forFeature([{ name: 'Upload', schema: UploadSchema }]), AwsModule],
  providers: [UploadService],
  exports: [UploadService],
})
export class UploadModule {}

上传.service.ts

import { Injectable } from '@nestjs/common';
import { AwsService } from '../../services/aws/aws.service';

import { Upload } from './upload.schema';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';

@Injectable()
export class UploadService {
  constructor(
    @InjectModel('Upload')
    readonly uploadModel: Model<Upload>,
    readonly awsService: AwsService,
  ) {}
}

预期输出

console.log(service.uploadModel); // X - returns `undefined`
console.log(service.configService); // X - returns `undefined`

是模型/服务实例。不幸的是,它们都返回了undefined,因为依赖注入没有发生。

【问题讨论】:

    标签: node.js dependency-injection nestjs


    【解决方案1】:

    我尝试了你所做的,并且在 nestjs 版本:7.6 中它按预期工作。

    所以我的假设是他们同时修复了它。

    【讨论】:

      【解决方案2】:

      我有同样的问题。文档实际上对此非常清楚:https://docs.nestjs.com/standalone-applications

      但我实际上遇到了同样的问题,我认为这不是预期的行为。我尝试删除一个又一个依赖项,看看是否有变化。

      我已经注入了请求范围内的服务。只要存在“无法解析的依赖项”(请求范围的依赖项),所有注入的依赖项都是未定义的。我预计会出现“无法解决依赖关系”错误,但它只是默默地失败了。

      另见https://github.com/nestjs/nest/issues/4630

      确保可以在独立应用的正确范围内成功创建所有依赖项。

      要获取具有例如请求范围依赖项的服务,请使用 module.resolve(Service) 而不是 get。

      【讨论】:

        猜你喜欢
        • 2016-02-16
        • 2017-02-20
        • 1970-01-01
        • 2018-05-25
        • 2020-07-01
        相关资源
        最近更新 更多