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

plupiseo  于 2023-03-09  发布在  TypeScript
关注(0)|答案(9)|浏览(145)

我遵循了Nest JS崩溃教程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>) {}
});

}

当我注解构造函数行时,它工作正常,我认为问题出在这一行,
从“mongoose”导入{ Model };
因为当我悬停在这一行时,它显示无法找到此模块的声明。我甚至尝试复制工作代码的package.json文件进行测试,但错误仍然相同
我的模块项包含控制器文件、服务文件、模块文件、dto文件、接口文件、模式文件、

7kjnsjlb

7kjnsjlb1#

为了解决这个问题,您必须从app.module.ts文件中删除ItemsController和ItemsService导入。
这是解决方案,因为:
1.您已经在items.module.ts文件中导入了ItemsController和ItemsService,因此没有必要在app.module.ts文件中再次导入它们。
1.在您的items.module.ts中,您有下一行:

@Module({
  imports: [MongooseModule.forFeature([{ name: 'Item', schema: ItemSchema }])],
  ...
})

,这是在items.service.ts文件中进行依赖注入所必需的,因为您可以在app.module.ts文件中检查,您没有该行。
1.当然,您可以将该行添加到您的app.module.ts文件中,但这样就没有必要创建items.module.ts文件。
检查我的repo xD。

eqfvzcg8

eqfvzcg82#

请从AppModule中删除ItemsControllerItemsService。无需将它们包含在AppModule中,因为您已经将ItemsModule导入到AppModule中。

    • 应用程序模块. 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 {}
    • 项目.服务. 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});
    }
}
sqougxex

sqougxex3#

我也面临着同样的问题,我从www.example.com中删除了ItemsController和ItemsService文件app.module.ts.now,它可以工作fine.so,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 {}
voase2hg

voase2hg4#

在应用程序模块中不使用其他控制器或提供程序,如UserController
app.module.ts

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

以及其他模块,如user.module.ts

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

fcipmucu5#

如果有两个模块相互依赖,不要在两个模块中都使用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 {}
smdnsysy

smdnsysy6#

我是这样解决的-

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: '',
      database: 'nest-react-auth',
      entities: [User],
      synchronize: true,
    }),
    TypeOrmModule.forFeature([User]),
  ],
  controllers: [AppController],
  providers: [AppService],
})

这里我添加了我的实体文件User-TypeOrmModule.forFeature([User]),并解决了它。

qxgroojn

qxgroojn7#

我也遇到了同样的问题。对我来说,我错过了其中一个子模块中提供者字段中的ServiceClass。然后我像下面这样指定它,错误就消失了。

@Module({
  imports: [MongooseModule.forFeature([{ name: 'test', schema: testSchema }])],
  controllers: [TestController],
  providers: [TestService],
})
j8yoct9x

j8yoct9x8#

请将@ItemModule导入到您要使用它的其他模块中。https://docs.nestjs.com/security/authentication

0kjbasz6

0kjbasz69#

我把它加到物品模块里

imports: [TypeOrmModule.forFeature([Item])],

相关问题