Nest не может разрешить зависимости пользовательского сервиса - PullRequest
0 голосов
/ 10 февраля 2020

Я в основном следую этому уроку с очень незначительными изменениями: ссылка

Я использую гнездо 6.14.2 на узле 12.10.0. При запуске моего приложения я получаю:

> 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 {}

Интересно, почему он кричит о ReconQuery Model , поскольку у меня нет такой сущности, только интерфейс ReconQuery.

1 Ответ

2 голосов
/ 10 февраля 2020

У вас есть дополнительные ReconQueryService в AppModule.

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() предоставляется по телефону MongooseModule.forFeature(...) на определенную @Module(). ReconQueryService в ReconQueryModule - это хорошо, потому что там у вас есть MongooseModule.forFeature(), поэтому @InjectModel() предоставляется правильно. Однако в AppModule у вас нет MongooseModule.forFeature(), поэтому Гнездо не может разрешить @InjectModel() для ReconQueryService.

Проверьте, действительно ли вам нужно использовать ReconQueryService в AppModule (службы и контроллеры, объявленные в AppModule). Если вы этого не сделаете, то удалите ReconQueryService из providers массива. Если вы это сделаете, то go до 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 {}

экспортировано вещи будут доступны для использования вне модуля, в котором они предусмотрены. Просто импортировать этот модуль куда-нибудь еще.

...