Typescript TypeORM 创建和保存数据的最佳方式

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

我目前正在开发一个 NestJS 项目,其中我必须将大量数据存储在单个数据库表中。

因此,我创建了一个实体、一个存储库、一个 dto 和一个路由来存储所有内容。我的 dto 就像我的实体一样非常长并且包含很多我必须存储的变量。

我的 dto 中的几乎每个变量都是可选的,并且在实体中所有内容都可以为空,因此我必须在为其创建数据集之前验证该值是否存在。

我的实体:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { distributionSponsors } from '../enums/distributionSponsors';
import { fbw } from '../enums/fbw';
import { MovieFskHf } from '../enums/movieFskHf';
import { MovieFskTr } from '../enums/movieFskTr';
import { MovieGenre } from '../enums/movieGenre';

@Entity()
export class Movie {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({ nullable: true })
    isPublished: boolean;

    @Column({ nullable: true })
    cinemaRelease: Date;

    ...// more following the same format
}

import { ParseIntPipe } from '@nestjs/common';
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsOptional, IsString } from 'class-validator';
import { distributionSponsors } from '../enums/distributionSponsors';
import { fbw } from '../enums/fbw';
import { MovieFskHf } from '../enums/movieFskHf';
import { MovieFskTr } from '../enums/movieFskTr';
import { MovieGenre } from '../enums/movieGenre';

export class CreateMovieDto {
    @ApiProperty()
    @IsOptional()
    isPublished: boolean;

    @ApiProperty()
    @IsOptional()
    cinemaRelease: Date;

    ... // more following the same format
}

现在在我的存储库中,我正在解构 dto。我不想将来自 dto 的每个变量包装到 if 语句中。有没有一种更简单的方法可以更紧凑地编写所有内容?

@EntityRepository(Movie)
export class MoviesRepository extends Repository<Movie> {
    async createMovie(
        createMovieDto: CreateMovieDto,
    ) {
        const movie = this.create();

        const {
            isPublished,
            cinemaRelease,
            title,
            orgTitle,
            ...//more following
        } = createMovieDto;


       /* need logic here to do something like
       *  if(title){
       *  movie.title = title
       *  }
       *  just for every single variable from the dto
       */

        try {
            await this.save(movie);
        } catch (error) {
            //blah
        }
    }
javascript typescript ecmascript-6 nestjs typeorm
1个回答
1
投票

您可以检查 DTO 对象并删除空属性:解决方案如下:

    async createMovie(
    createMovieDto: CreateMovieDto,
) {
    Object.keys(createMovieDto).forEach(
        k =>
        createMovieDto[k] == null ||
          (createMovieDto[k] == '' && delete createMovieDto[k]), 
      );

    try {
        await this.save(createMovieDto);
    } catch (error) {
        //blah
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.