【问题标题】:NestJS can't resolve dependencies - Can't get model repository into serviceNestJS 无法解决依赖关系 - 无法将模型存储库投入使用
【发布时间】:2021-12-26 17:01:57
【问题描述】:

我有一个非常常用的 NestJS 后端。用户模型具有与状态模型相关联的状态。所以 Status 是一个单独的模块,包含模型、模块、控制器和服务文件。

启动服务器时出现错误:

ERROR [ExceptionHandler] Nest can't resolve dependencies of the StatusesService (?). Please make sure that the argument StatusRepository at index [0] is available in the StatusesService context.

Potential solutions:
- If StatusRepository is a provider, is it part of the current StatusesService?
- If StatusRepository is exported from a separate @Module, is that module imported within StatusesService?
  @Module({
    imports: [ /* the Module containing StatusRepository */ ]
  })


at Injector.lookupComponentInParentModules (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:201:19)
at Injector.resolveComponentInstance (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:156:33)
at resolveParam (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:108:38)
at async Promise.all (index 0)
at Injector.resolveConstructorParams (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:123:27)
at Injector.loadInstance (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:52:9)
at Injector.loadProvider (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/injector.js:74:9)
at async Promise.all (index 0)
at InstanceLoader.createInstancesOfProviders (/Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/instance-loader.js:44:9)
at /Users/macbook/WebstormProjects/getguitar/backend/node_modules/@nestjs/core/injector/instance-loader.js:29:13

但 StatusRepository 只是一个 Status 模型存储库,我不必将它作为 StatusService 的一部分。我已经使用 SequelizeModule.forFeature([Status]) 将状态模型添加到模块中 - 就像它在官方 NestJS 文档中解释的那样,它应该完成所有工作:

import {Module} from '@nestjs/common';
import { StatusesService } from './statuses.service';
import {SequelizeModule} from "@nestjs/sequelize";
import {Status} from "./statuses.model";
import { StatusesController } from './statuses.controller';

@Module({
  providers: [StatusesService],
  controllers: [StatusesController],
  imports: [SequelizeModule.forFeature([Status])],
  exports: [StatusesService]
})
export class StatusesModule {}

但事实并非如此。它不是提供者或任何其他要导入的东西。我只是没有看到问题,所以我找不到解决方案。有趣的是,引入模型存储库的相同方式也适用于此应用程序中的其他模型,但 Status 表现得非常特别:)

这里是服务文件,错误是由 StatusesService 类的这个构造函数产生的:

import {HttpException, HttpStatus, Injectable} from '@nestjs/common';
import {InjectModel} from "@nestjs/sequelize";
import {Status} from "./statuses.model";
import {CreateStatusDto} from "./dto/create-status.dto";

@Injectable()
export class StatusesService {

    constructor(@InjectModel(Status) private statusesRepository: typeof Status) {}

    async createStatus(dto: CreateStatusDto) {
        try {
            return await this.statusesRepository.create(dto)
        } catch (e) {
            throw new HttpException(`Error in createStatus: ${e}`, HttpStatus.INTERNAL_SERVER_ERROR)
        }
    }
}

这里是用于检查的状态模型:

import {Column, DataType, HasMany, Model, Table} from "sequelize-typescript";
import {ApiProperty} from "@nestjs/swagger";
import {User} from "../users/users.model";
import {UserStatuses} from "../app.constants";

interface StatusCreationAttrs {
    value: string
    description: string
}

@Table({tableName: 'statuses', createdAt: false, updatedAt: false})
export class Status extends Model<Status, StatusCreationAttrs> {

    @ApiProperty({description: 'Unique ID', type: Number})
    @Column({type: DataType.INTEGER, unique: true, autoIncrement: true, primaryKey: true})
    id: number

    @ApiProperty({description: 'Unique value for the instance', enum: UserStatuses, required: true})
    @Column({type: DataType.ENUM({values: Object.keys(UserStatuses)}), unique: true, allowNull: false})
    value: string

    @ApiProperty({description: 'Description for the Status', type: String, required: true})
    @Column({type: DataType.STRING, allowNull: false})
    description: string

    @HasMany(() => User)
    users: User[]
}

这里是 app.module

import {Module} from '@nestjs/common';
import {SequelizeModule} from "@nestjs/sequelize"
import {ConfigModule} from "@nestjs/config"
import {AuthModule} from './auth/auth.module';
import {UsersModule} from './users/users.module';
import {TokensModule} from './tokens/tokens.module';
import {RolesModule} from './roles/roles.module';
import {TransactionsModule} from './transactions/transactions.module';
import {User} from "./users/users.model";
import {Transaction} from "./transactions/transactions.model";
import {Status} from "./statuses/statuses.model";
import {Role} from "./roles/roles.model";
import {Token} from "./tokens/tokens.model";
import { StatusesModule } from './statuses/statuses.module';

@Module({
    imports: [
        ConfigModule.forRoot({
            envFilePath: `.${process.env.NODE_ENV}.env`
        }),
        SequelizeModule.forRoot({
            dialect: "postgres",
            host: process.env.POSTGRES_HOST,
            port: Number(process.env.POSTGRESS_PORT),
            username: process.env.POSTGRES_USER,
            password: process.env.POSTGRESS_PASSWORD,
            database: process.env.POSTGRES_DB,
            models: [
                User,
                Status,
                Role,
                Transaction,
                Token
            ],
            autoLoadModels: true,
            synchronize: true
        }),
        AuthModule,
        UsersModule,
        TokensModule,
        RolesModule,
        TransactionsModule,
        StatusesModule,
    ],
    controllers: [],
    providers: [],
})
export class AppModule {
}

我很想解决这个问题。这似乎是一件非常简单的事情,但我仍然没有胶水。提前致谢!

【问题讨论】:

  • 如果你改用SequelizeModule.forFeature([StatusRepository])会怎样?
  • 嗨 Micael,我会尝试,但 StatusRepository 在服务文件之外不存在 - 我使用 Status 模型作为存储库在服务的构造函数中创建它。如果您知道如何将其导入模块文件的任何技巧,请告诉我。
  • 哦,对了。我认为这是一个custom repo 我建议使用自定义仓库而不是 btw
  • 请编辑您的问题以添加SequelizeModule.forRoot 部分。我看不出你分享的代码有什么问题
  • 谢谢,刚刚添加了带有SequelizeModule.forRoot 的app.module

标签: sequelize.js nestjs


【解决方案1】:

根据错误as described here in detail,您在应用程序某处的某个模块的imports 数组中有StatusesService。从imports 中删除它,并且只在imports 数组中保留@Module() 装饰类(或动态模块)

【讨论】:

  • Jay,非常感谢您的帮助。我吓坏了,从头开始完全重建应用程序 - 我将 Status 设置为 User 模型中的枚举类型))
猜你喜欢
  • 2019-09-12
  • 2020-06-14
  • 2020-05-31
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2015-04-09
  • 2016-02-16
  • 2017-02-20
相关资源
最近更新 更多