Nest 无法解析 ItemsService (?) 的依赖项。请确保索引 [0] 处的参数在 AppModule 上下文中可用

Muh*_*ras 13 typescript nestjs

我遵循了Nest JS Crash 教程,Youtube Link,我遵循了这个,但是当我在服务中导入接口时,它显示错误

Nest 无法解析 ItemsService (?) 的依赖项。请确保索引 [0] 处的参数在 AppModule 上下文中可用。

我克隆了教程中给出的存储库,它工作正常,但是当我将该存储库的 src 文件夹复制到我的项目时,它会引发错误。这是我的服务文件

import { Injectable } from '@nestjs/common';
import { Item } from './interfaces/item.interface';
import { Model } from 'mongoose';

import { ItemsModule } from './items.module'

import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class ItemsService {
  constructor(@InjectModel('Item') private readonly itemModel: Model<Item>) {}
});

}
Run Code Online (Sandbox Code Playgroud)

当我评论构造函数行时,它工作正常,我认为问题出在这一行上,

从'猫鼬'导入{模型};

因为当我将鼠标悬停在这一行时,它显示找不到此模块的声明。我什至尝试复制工作代码的 package.json 文件进行测试,但仍然错误保持不变

我的模块项目包含控制器文件、服务文件、模块文件、dto 文件、接口文件、架构文件、

小智 39

为了解决它,您必须从app.module.ts文件中删除 ItemsController 和 ItemsService 导入。

这是解决方案,因为:

  1. 您已经在items.module.ts文件中导入了 ItemsController 和 ItemsService,因此没有必要在app.module.ts文件中再次导入它们。
  2. items.module.ts你有下一行:
    @Module({
      imports: [MongooseModule.forFeature([{ name: 'Item', schema: ItemSchema }])],
      ...
    })
    
    Run Code Online (Sandbox Code Playgroud) 这是使items.service.ts文件中的依赖注入工作所必需的,因为您可以签入app.module.ts没有该行的 文件。
  3. 当然,您可以将该行添加到您的app.module.ts文件中,但是创建该items.module.ts文件是没有意义的 。

检查我的回购xD。


小智 16

请从 中删除ItemsController和。无需将它们包含在中,因为您已经导入 到.ItemsServiceAppModuleAppModuleItemsModuleAppModule

应用程序模块.ts

import { AppService } from './app.service';
import { ItemsModule } from "./items/items.module";
import { MongooseModule} from '@nestjs/mongoose';
import config from './config/keys';


@Module({
  imports: [ItemsModule, MongooseModule.forRoot(config.mongoURI)],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

项目.service.ts

import { Injectable } from '@nestjs/common';
import { Item } from './interfaces/items.interface';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class ItemsService {

    constructor(@InjectModel('Item') private readonly itemModel:Model<Item>){}   

    async findAll(): Promise<Item[]> {
        return await this.itemModel.find();
    }

    async fineOne(id: string): Promise<Item> {
        return await this.itemModel.findOne({_id: id});
    }
}
Run Code Online (Sandbox Code Playgroud)


Nan*_*tha 13

我也遇到了同样的问题。我从 app.module.ts 中删除了 ItemsController 和 ItemsService 文件。现在它工作正常。所以 app.module.ts 看起来像这样。

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ItemsController } from './items/items.controller';
import { ItemsService } from './items/items.service';
import {MongooseModule} from '@nestjs/mongoose';import { ItemsModule } from 
 './items/items.module';
import config from './config/keys';

@Module({
  imports: [ItemsModule,MongooseModule.forRoot(config.mongoURI)],
  controllers: [AppController ],
  providers: [AppService ],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)


小智 8

在应用程序模块中不要使用其他控制器或提供程序,例如 UserController

应用程序模块.ts

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:27017/nest'),
    UserModule,
    TasksModule,
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
Run Code Online (Sandbox Code Playgroud)

和其他模块,如 user.module.ts

@Module({
  imports: [
    MongooseModule.forFeature([
      {
        name: 'users',
        schema: UserSchema,
      },
    ]),
  ],
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
Run Code Online (Sandbox Code Playgroud)


Ahm*_*nes 6

如果您有两个模块相互依赖,请不要直接导入它们,在两个模块中使用forwardRef()

循环依赖

@Module({
  imports: [
     MongooseModule.forFeature([
       { name: 'User', schema: UserSchema },
     ]),
    forwardRef(() => BusinessModule),
  ],
  providers: [UserService, UserResolver],
  exports: [MongooseModule],
})
export class UserModule {}
Run Code Online (Sandbox Code Playgroud)

并在另一个模块中

@Module({
  imports: [
    MongooseModule.forFeature([
       { name: 'Business', schema: BusinessSchema },
     ]),
    forwardRef(() => UserModule),
  ],
  providers: [BusinessService, BusinessResolver],
  exports: [MongooseModule],
})
export class BusinessModule {}
Run Code Online (Sandbox Code Playgroud)