当我在nestJS中使用可重用的CRUD API时,存储库显示为未定义

问题描述 投票:0回答:1

我正在尝试创建一个通用的可重用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},但后来我得到了错误,用户没有元数据。

mysql nestjs typeorm nestjs-typeorm
1个回答
0
投票

我在每个存储库或服务中实现了 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>;
}

© www.soinside.com 2019 - 2024. All rights reserved.