【发布时间】: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