You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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')根源在于实体类的两个配置错误:

  1. ID字段装饰器冲突:同时使用@Column和@PrimaryGeneratedColumn装饰id字段,导致TypeORM无法正确识别主键元数据,进而让@nestjsx/crud获取配置时出现空指针。修改id字段:
@PrimaryGeneratedColumn({ type: 'bigint' })
id: number;
  1. 更新时间字段装饰器错误:updated_at使用@CreateDateColumn只会在创建时赋值,更新时不会自动修改,应替换为@UpdateDateColumn:
@CreateDateColumn({ name: 'created_at', type: 'timestamp' })
CreatedAt: Date;

@UpdateDateColumn({ name: 'updated_at', type: 'timestamp' })
UpdatedAt: Date;

修改完成后重启服务,创建分类的请求即可正常执行。

内容的提问来源于stack exchange,提问作者Khanh Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:07:45