我正在尝试创建一个通用的可重用CRUD,可以在使用NestJs、TypeORM和MySQL的程序中使用
虽然最初没有显示错误,并且根据需要在数据库中创建了表。
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [InstanceLoader] TypeOrmModule dependencies initialized +97ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [InstanceLoader] AppModule dependencies initialized +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [InstanceLoader] UserModule dependencies initialized +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [InstanceLoader] TypeOrmCoreModule dependencies initialized +50ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [InstanceLoader] TypeOrmModule dependencies initialized +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RoutesResolver] AppController {/}: +4ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RoutesResolver] UserController {/users}: +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/users, GET} route +1ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/users/:id, GET} route +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/users, POST} route +1ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/users/:id, PUT} route +0ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [RouterExplorer] Mapped {/users/:id, DELETE} route +1ms
[Nest] 8576 - 22/04/2024, 11:34:14 am LOG [NestApplication] Nest application successfully started +1ms
如果我尝试使用 POSTMAN 发布虚拟数据。它显示内部服务器错误并显示以下错误。
Received data for creation: {
name: 'John Doe',
email: '[email protected]',
password: 'password123'
}
Received Repository: undefined
[Nest] 8576 - 22/04/2024, 11:34:16 am ERROR [ExceptionsHandler] Cannot read properties of undefined (reading 'save')
TypeError: Cannot read properties of undefined (reading 'save')
这是我的基础存储库。这是我的 console.log 已完成的地方。
import { DeepPartial, FindOneOptions, Repository } from 'typeorm';
import { BaseEntity } from '../base.entity/base.entity';
import { BadGatewayException, Injectable } from '@nestjs/common';
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
export abstract class BaseRepository<T extends BaseEntity> {
constructor(private readonly repository: Repository<T>) {}
async findAll(): Promise<T[]> {
return this.repository.find();
}
async findById(id: number): Promise<T> {
const entity = await this.repository.findOne(id as FindOneOptions<T>);
return entity;
}
async create(data: Partial<T>): Promise<T> {
console.log('Received data for creation:', data);
console.log('Received Repository:', this.repository);
return await this.repository.save(data as DeepPartial<T>);
}
async update(id: number, data: Partial<T>): Promise<T> {
await this.repository.update(id, data as QueryDeepPartialEntity<T>);
return this.findById(id);
}
async delete(id: number): Promise<void> {
await this.repository.delete(id);
}
}
这是要使用它的userRepository。
import { Repository } from 'typeorm';
import { BaseRepository } from '../basic-crud/basic-repository';
import { User } from '../user.entity/user.entity';
export class UserRepository extends BaseRepository<User> {
constructor( repository: Repository<User>) {
super(repository);
}
}
这是用户模块
import { Module } from '@nestjs/common';
import { UserService } from 'src/services/user/user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserRepository } from 'src/entities/user-repository/user-repository';
import { User } from 'src/entities/user.entity/user.entity';
import { UserController } from 'src/users/contollers/users/users.controller';
@Module({
imports: [TypeOrmModule.forFeature([User,UserRepository])],
providers: [UserService, UserRepository],
controllers: [UserController],
exports: [UserService, UserRepository],
})
export class UserModule {}
这是我的应用程序模块。
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './module/users/users.module';
import { User } from './entities/user.entity/user.entity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'test',
password: 'test',
database: 'test',
entities: [User],
autoLoadEntities: true,
synchronize: true,
}),
UserModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
我尝试了其他一些类似问题中提到的
@InjectRepository(Repository) Repository: Repository,
{https://stackoverflow.com/questions/63988821/nestjs-inject-custom-typeorm-repository-based-on-an-interface},但后来我得到了错误,用户没有元数据。
我在每个存储库或服务中实现了 IRepository,并且它有效
import { BaseEntity } from '../../entities/base.entity/base.entity';
export interface IRepository<T extends BaseEntity> {
findAll(): Promise<T[]>;
findById(id: number): Promise<T>;
create(data: Partial<T>): Promise<T>;
update(id: number, data: Partial<T>): Promise<T>;
delete(id: number): Promise<void>;
}