【问题标题】:Inject class implementation into abstract controller implementation based on an interface via NestJS通过 NestJS 将类实现注入基于接口的抽象控制器实现
【发布时间】:2021-01-02 06:08:54
【问题描述】:

我目前正在尝试使用 NestJS 注入进行设置,但在尝试运行服务器时遇到了错误。

我遇到的问题与我试图将一个类注入到扩展抽象类的控制器中有关,并且我试图在构造函数中设置抽象类的属性。

Controller.ts

@Controller()
export class exampleController extends AbstractController {

  constructor(exampleClass: exampleInterface) {
    super(exampleClass);
  }

  @Get()
  getExample(): string {
    return 'Example';
  };
}

AbstractController.ts

export abstract class AbstractController {

  private exampleClass: ExampleInterface;

  constructor(exampleClass: ExampleInterface) {
    this.exampleClass = exampleClass;
  };

当我尝试运行我的服务器时,我收到以下错误:

Error: Nest can't resolve dependencies of the ExampleController (?). Please make sure that the argument Object at index [0] is available in the AppModule context.

我已将类实现添加到 app.module 提供程序,但即便如此,该错误也会阻止我运行我的代码。

App.Module.ts

@Module({
  imports: [],
  controllers: [AppController, ExampleController],
  providers: [ExampleClass],
})
export class AppModule {}

ExampleClass.ts

@Injectable()
export class ExampleClass implements ExampleInterface {

  doSomething(): void {
    console.log('Hello World!');
  };
};

我已经尝试了不同的设置并查看了其他一些 StackOverflow 问题,这些问题建议更改 app.module 中的提供程序,但我还没有找到适合我的设置。任何建议将不胜感激。

【问题讨论】:

    标签: node.js typescript nestjs


    【解决方案1】:

    Typescript 接口是一个编译时构造(当代码实际运行时它们根本不存在),因此 Nest 无法理解您要注入的参数。

    您必须使用提供程序配置指定您自己的注入令牌,然后在 ExampleController 构造函数中使用它。

    providers: [{ provide: 'ExampleToken', useClass: ExampleClass}]
    

    然后您可以使用ExampleToken(或您的应用中任何有意义的方式)将其注入您的控制器

    @Controller()
    export class exampleController extends AbstractController {
    
      constructor(@Inject('ExampleToken') exampleClass: exampleInterface) {
        super(exampleClass);
      }
    
      @Get()
      getExample(): string {
        return 'Example';
      };
    }
    

    【讨论】:

    • 是的,再次尝试后,我让它工作了。我第一次尝试时忘记在控制器中添加Inject('ExampleToken')。
    猜你喜欢
    • 2019-10-28
    • 2012-07-17
    • 2012-01-20
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多