使用@nestjsx/crud创建Category时报Cannot read properties of null错误
Bug报告
[Nest] 14964 - 2023年8月24日 00:15:56 ERROR [ExceptionsHandler] Cannot read properties of null (reading 'options') TypeError: Cannot read properties of null (reading 'options') at CategoryService.createOne (\node_modules\@nestjsx\crud-typeorm\src\typeorm-crud.service.ts:118:35) at CategoryController.createOneBase (\node_modules\@nestjsx\crud\src\crud\crud-routes.factory.ts:227:27) at \node_modules\@nestjs\core\router\router-execution-context.js:38:29 at processTicksAndRejections (node:internal/process/task_queues:95:5)
当前行为
尝试创建新分类时传入以下JSON参数:
{ "name": "New Category" }
触发上述报错,无法创建分类。
输入代码
实体(Entity)
import { Column, Entity, PrimaryGeneratedColumn, CreateDateColumn, DeleteDateColumn, OneToMany, } from 'typeorm'; import { Product } from './product.entity'; @Entity('category') export class Category { @Column({ name: 'id', type: 'bigint' }) @PrimaryGeneratedColumn() id: number; @Column({ name: 'name', nullable: false }) name: string; @CreateDateColumn({ name: 'created_at', type: 'timestamp' }) CreatedAt: Date; @CreateDateColumn({ name: 'updated_at', type: 'timestamp' }) UpdatedAt: Date; @DeleteDateColumn({ name: 'deleted_at', nullable: true }) DeletedAt?: Date; @OneToMany(() => Product, (product) => product.category) products: Product[]; }
控制器(Controller)
import { Controller } from '@nestjs/common'; import { Crud, CrudController } from '@nestjsx/crud'; import { ApiTags } from '@nestjs/swagger'; import { CategoryService } from './category.service'; import { CreateCategoryDto, UpdateCategoryDto } from './dto/category.dto'; import { Category } from '../../database/entity/category.entity'; @ApiTags('category') @Crud({ model: { type: Category, }, dto: { create: CreateCategoryDto, update: UpdateCategoryDto, }, query: { join: { products: { eager: true, }, }, }, routes: { only: [ 'getManyBase', 'getOneBase', 'createOneBase', 'updateOneBase', 'deleteOneBase', ], }, }) @Controller('category') export class CategoryController implements CrudController<Category> { constructor(public service: CategoryService) {} }
服务(Service)
import { Injectable } from '@nestjs/common'; import { TypeOrmCrudService } from '@nestjsx/crud-typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Category } from '../../database/entity/category.entity'; @Injectable() export class CategoryService extends TypeOrmCrudService<Category> { constructor(@InjectRepository(Category) repository: Repository<Category>) { super(repository); } }
模块(Module)
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { CategoryController } from './category.controller'; import { CategoryService } from './category.service'; import { Category } from '../../database/entity/category.entity'; @Module({ imports: [TypeOrmModule.forFeature([Category])], controllers: [CategoryController], providers: [CategoryService], }) export class CategoryModule {}
数据传输对象(DTO)
import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsOptional, IsString } from 'class-validator'; export class CreateCategoryDto { @ApiProperty() @IsNotEmpty() @IsString() name: string; } export class UpdateCategoryDto { @ApiProperty() @IsOptional() @IsString() name?: string; }
期望行为
成功创建带有指定名称的新分类。
环境信息
- 包版本:0.0.1
- Node版本:v18.16.0
- 操作系统:Windows
- 数据库:Postgres
- 依赖版本:
- "@nestjs/common": "^10.0.0"
- "@nestjs/core": "^10.0.0"
- "@nestjs/typeorm": "^10.0.0"
- "pg": "^8.11.2"
- "@nestjsx/crud": "^5.0.0-alpha.3"
- "@nestjsx/crud-typeorm": "^5.0.0-alpha.3"
问题解决
报错Cannot read properties of null (reading 'options')根源在于实体类的两个配置错误:
- ID字段装饰器冲突:同时使用
@Column和@PrimaryGeneratedColumn装饰id字段,导致TypeORM无法正确识别主键元数据,进而让@nestjsx/crud获取配置时出现空指针。修改id字段:
@PrimaryGeneratedColumn({ type: 'bigint' }) id: number;
- 更新时间字段装饰器错误:
updated_at使用@CreateDateColumn只会在创建时赋值,更新时不会自动修改,应替换为@UpdateDateColumn:
@CreateDateColumn({ name: 'created_at', type: 'timestamp' }) CreatedAt: Date; @UpdateDateColumn({ name: 'updated_at', type: 'timestamp' }) UpdatedAt: Date;
修改完成后重启服务,创建分类的请求即可正常执行。
内容的提问来源于stack exchange,提问作者Khanh Nguyen
相关产品推荐
相关产品推荐

