【问题标题】:Nest can't resolve dependencies of custom serviceNest 无法解析自定义服务的依赖关系
【发布时间】:2020-02-10 10:14:49
【问题描述】:

我基本上是按照这个教程做了非常小的修改:link

我在节点 12.10.0 上使用嵌套 6.14.2。 运行我的应用程序时,我得到:

> recon-backend@0.0.1 start C:\Users\e5553079\Desktop\Node_Projects\recon-backend
> nest start

[Nest] 8324   - 02/10/2020, 9:28:21 AM   [NestFactory] Starting Nest application...
[Nest] 8324   - 02/10/2020, 9:28:21 AM   [InstanceLoader] MongooseModule dependencies initialized +53ms
[Nest] 8324   - 02/10/2020, 9:28:21 AM   [ExceptionHandler] Nest can't resolve dependencies of the ReconQueryService (?). Please make sure that the argument ReconQueryModel at index [0] is available in the AppModule context.

Potential solutions:
- If ReconQueryModel is a provider, is it part of the current AppModule?
- If ReconQueryModel is exported from a separate @Module, is that module imported within AppModule?
  @Module({
    imports: [ /* the Module containing ReconQueryModel */ ]
  })
 +2ms
Error: Nest can't resolve dependencies of the ReconQueryService (?). Please make sure that the argument ReconQueryModel at index [0] is available in the AppModule context.

我的文件如下所示:

1. app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose';
import { ReconQueryModule } from './reconQuery/reconQuery.module';
import { ReconQueryService } from './reconQuery/reconQuery.service';
import { ReconQueryController } from './reconQuery/reconQuery.controller';
@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/backend-app', { useNewUrlParser: true }),
    ReconQueryModule
  ],
  controllers: [AppController, ReconQueryController],
  providers: [AppService, ReconQueryService],
})
export class AppModule {}

2。 reconQuery.service.ts

import { Injectable } from '@nestjs/common';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { ReconQuery } from './interfaces/reconQuery.interface';
import { CreateReconQueryDTO } from './dto/create-reconQuery.dto';

@Injectable()
export class ReconQueryService {
    constructor(@InjectModel('ReconQuery') private readonly reconQueryModel: Model<ReconQuery>) { }
    // Fetch all queries
    async getAllQueries(): Promise<ReconQuery[]> {
        const queries = await this.reconQueryModel.find().exec();
        return queries;
    }
...

3. reconQuery.interface.ts

import { Document } from 'mongoose';

export interface ReconQuery extends Document {
    readonly id: number;
    readonly name: string;
    readonly sql: string;
}

4. reconQuery.module.ts

import { Module } from '@nestjs/common';
import { ReconQueryController } from './reconQuery.controller';
import { ReconQueryService } from './reconQuery.service';
import { MongooseModule } from '@nestjs/mongoose';
import { ReconQuerySchema } from './schemas/reconQuery.schema';
@Module({
  imports: [
    MongooseModule.forFeature([{ name: 'ReconQuery', schema: ReconQuerySchema }])
  ],
  controllers: [ReconQueryController],
  providers: [ReconQueryService]
})
export class ReconQueryModule {}

我想知道为什么它为 ReconQueryModel 哭泣,因为我没有这样的实体,只有一个 ReconQuery 接口。

【问题讨论】:

    标签: javascript typescript nestjs injectable


    【解决方案1】:

    AppModule 中提供了额外的ReconQueryService

    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { MongooseModule } from '@nestjs/mongoose';
    import { ReconQueryModule } from './reconQuery/reconQuery.module';
    import { ReconQueryService } from './reconQuery/reconQuery.service';
    import { ReconQueryController } from './reconQuery/reconQuery.controller';
    @Module({
      imports: [
        MongooseModule.forRoot('mongodb://localhost/backend-app', { useNewUrlParser: true }),
        ReconQueryModule
      ],
      controllers: [AppController, ReconQueryController],
      providers: [AppService, ReconQueryService], // <-- this causes the error
    })
    export class AppModule {}
    

    @InjectModel() 是通过在某个@Module() 上调用MongooseModule.forFeature(...) 来提供的。 ReconQueryService in ReconQueryModule 很好,因为那是您调用 MongooseModule.forFeature() 的地方,因此正确提供了 @InjectModel()。但是,在AppModule 中,您没有MongooseModule.forFeature(),因此Nest 无法解析@InjectModel()ReconQueryService

    检查您是否真的需要在AppModule 中使用ReconQueryServiceAppModule 中声明的服务和控制器)。如果不这样做,则从 providers 数组中删除 ReconQueryService。如果您这样做,请转到ReconQueryModule 并执行以下操作:

    import { Module } from '@nestjs/common';
    import { ReconQueryController } from './reconQuery.controller';
    import { ReconQueryService } from './reconQuery.service';
    import { MongooseModule } from '@nestjs/mongoose';
    import { ReconQuerySchema } from './schemas/reconQuery.schema';
    @Module({
      imports: [
        MongooseModule.forFeature([{ name: 'ReconQuery', schema: ReconQuerySchema }])
      ],
      controllers: [ReconQueryController],
      providers: [ReconQueryService],
      exports: [ReconQueryService] // <-- add this line
    })
    export class ReconQueryModule {}
    

    导出的东西可以在提供它们的模块之外使用。只需将该模块导入其他地方即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 2019-06-29
      • 1970-01-01
      • 2019-02-24
      • 2022-01-17
      • 2018-11-21
      • 2020-03-12
      • 2020-07-03
      相关资源
      最近更新 更多