Nest 无法解析 ItemsService (?) 的依赖关系。请确保索引 [0] 处的参数在 AppModule 上下文中可用
Posted
技术标签:
【中文标题】Nest 无法解析 ItemsService (?) 的依赖关系。请确保索引 [0] 处的参数在 AppModule 上下文中可用【英文标题】:Nest can't resolve dependencies of the ItemsService (?). Please make sure that the argument at index [0] is available in the AppModule context 【发布时间】:2019-11-14 03:59:08 【问题描述】:我遵循了 Nest JS Crash 教程,Youtube Link, 我跟着这个,但是当我在服务中导入接口时它显示错误
。
我克隆了教程中给出的存储库,它工作正常,但是当我将该存储库的 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>)
);
当我评论构造函数行时,它工作正常, 我认为问题在于这条线,
从“猫鼬”导入模型;
因为当我将鼠标悬停在这一行时,它显示找不到该模块的声明。 我什至尝试复制工作代码的 package.json 文件进行测试,但错误仍然相同
我的模块项目包含,控制器文件,服务文件,模块文件, dto 文件、接口文件、模式文件、
【问题讨论】:
在你ItemsModule
中你导入MongooseModule.forFeature([name: 'Item', schema: ItemSchema])
?
是的,我已经添加了这个
嗯,没有看到你 ItemsModule
和 ItemSchema
文件,很难调试这个。发生这种情况是由于 Nest 找不到您正在注入的模块/服务,通常意味着它在您的模块文件中未正确定义,或者未正确实现。
【参考方案1】:
如果你有两个模块相互依赖 不要直接在两个模块中使用 forwardRef() 导入它们
来源Circular dependency
@Module(
imports: [
MongooseModule.forFeature([
name: 'User', schema: UserSchema ,
]),
forwardRef(() => BusinessModule),
],
providers: [UserService, UserResolver],
exports: [MongooseModule],
)
export class UserModule
在另一个模块中
@Module(
imports: [
MongooseModule.forFeature([
name: 'Business', schema: BusinessSchema ,
]),
forwardRef(() => UserModule),
],
providers: [BusinessService, BusinessResolver],
exports: [MongooseModule],
)
export class BusinessModule
【讨论】:
【参考方案2】:请从AppModule
中删除ItemsController
和ItemsService
。无需将它们包含在 AppModule
中,因为您已经将 ItemsModule
导入到 AppModule
中。
app.module.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
items.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);
【讨论】:
【参考方案3】:我也遇到了同样的问题。我从 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
【讨论】:
【参考方案4】:为了解决这个问题,您必须从 app.module.ts
文件中删除 ItemsController 和 ItemsService 导入。
这是解决方案,因为:
-
您已经在
items.module.ts
文件中导入了 ItemsController 和 ItemsService,因此无需导入
在app.module.ts
文件中再次显示它们。
在你的items.module.ts
你有下一行:
@Module(
imports: [MongooseModule.forFeature([ name: 'Item', schema: ItemSchema ])],
...
)
这是使items.service.ts
文件中的依赖注入工作所必需的,因为您可以签入
app.module.ts
文件你没有那行。
当然,您可以将该行添加到您的app.module.ts
文件中,但是创建
items.module.ts
文件。
查看我的repo xD。
【讨论】:
感谢您的解决方案,它可以工作,但是我不明白为什么在 items.module.ts 中导入 ItemsController 和 ItemsService 会导致错误? 从 app.module.ts 中移除 itemsServices 和 ItemsController 工作正常。 拯救了我的一天!谢谢!以上是关于Nest 无法解析 ItemsService (?) 的依赖关系。请确保索引 [0] 处的参数在 AppModule 上下文中可用的主要内容,如果未能解决你的问题,请参考以下文章
Nest.js 在单元测试中无法解析 Mongoose 模型依赖
Nest 无法解析 UsersService (UserModel, ?) 的依赖关系