我是 NestJS 新手,正在使用 NestJS 和 Sequelize 开发应用程序。我想跨不同模块共享属于特定实体的存储库。 我有
users
和 instituteAcademics
模块,比如说,当我想创建一个 institute
时,我想验证用户详细信息,这是一个非常简单的用例。所以我需要 users
模块中 instituteAcademics
存储库的引用,这样我就可以在相关处理程序中查询。
以下是不同文件的代码:
instituteAcademics.module.ts
const repositories: Provider[] = [InstitutesRepository];
const controllers = [InstitutesController, StudentsController];
const entities = [Institutes, InstituteLevels, Students, StudentEnrollments];
const handlers: Provider[] = [
GetInstitutesHandler,
GetStudentDetailsHandler,
GetStudentsListHandler,
CreateStudentHandler,
CreateInstituteHandler,
];
@Module({
imports: [UsersModule, CqrsModule, SequelizeModule.forFeature([...entities])],
controllers,
providers: [...repositories, ...handlers],
exports: [],
})
export class InstituteAcademicsModule {}
users.module.ts
const repositories: Provider[] = [UsersRepository];
const entities = [Users, UserAddresses, UserContacts];
const controllers = [UsersController];
const handlers: Provider[] = [GetUsersHandler, CreateUserHandler];
@Module({
imports: [CqrsModule, SequelizeModule.forFeature([...entities])],
controllers,
providers: [...handlers, ...repositories],
exports: [SequelizeModule],
})
export class UsersModule {}
如果您观察到我已经导出了
SequelizeModule
,根据我对link的理解
users.repository.ts
@Injectable()
export class UsersRepository {
constructor(
@InjectModel(Users)
private userModel: typeof Users,
) {}
async createUsers(users: UsersCreationAttributes[]): Promise<Users[]> {
return this.userModel.bulkCreate(users);
}
async createUser(user: UsersCreationAttributes): Promise<Users> {
return this.userModel.create(user);
}
async deleteUser(user: UsersCreationAttributes): Promise<any> {
return this.userModel.destroy({ where: { _id: user._id } });
}
async findOne(firstName: string): Promise<Users | null> {
return this.userModel.findOne({
where: {
first_name: firstName,
},
});
}
}
我想使用下面的
userRepository
createInstitute.handler.ts
:
@Injectable()
@CommandHandler(CreateInstituteCommand)
@JoiSchemaValidationHandler(CreateInstituteCommand, createStudentCommandSchema)
export class CreateInstituteHandler
implements ICommandHandler<CreateInstituteCommand>
{
constructor(
private userRepository: UsersRepository,
private institutesRepository: InstitutesRepository,
) {}
async execute(command: CreateInstituteCommand) {
const userEntity = CreateInstituteMapper.toUserEntity(command.request);
console.log(`CreateStudentHandler`, userEntity);
}
}
我收到以下错误:
感谢任何帮助。谢谢!
在此文件中
instituteAcademics.module.ts
您必须添加 UsersRepository 作为提供者并添加您的 Users 实体
const repositories: Provider[] = [UsersRepository, InstitutesRepository];
const entities = [Institutes, InstituteLevels, Students, StudentEnrollments, Users];
您可以实现的另一个选项存储库模式
repository.ts
import { Model } from 'sequelize-typescript';
export class Repository<T extends Model<T>> {
constructor(protected model: ModelStatic<T>) {}
}
users.repository.ts
import { Users } from './users.entities'
@Injectable()
export class UsersRepository extends Repository<Users> {
constructor() {
super(Users);
}
//your custom methods here
async findAll(): Promise<Users> {
return this.model.findAll();
}
}
institute-academics.module.ts
import { UsersRepository } from './users.repository';
@Module({
imports: [/** some import module here **/],
providers: [UsersRepository],
exports: [UsersRepository],
})
export class InstitueAcademicsModule {}
然后只需在您的 AppModule 中导入 SequelizeModule