swagger NestJs:TypeError:Dto上的类构造函数OmitTypeClass

mrphzbgm  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(173)

当nesjsMap一个用OmitType创建的Dto类时,我在一个简单的POST端点上遇到了问题(所有以这种方式创建的dto都会发生)。这对我来说很奇怪,因为这个端点和其他端点都工作得很好,也许是版本的问题?
我希望你能帮助我,谢谢!
错误代码:

TypeError: Class constructor OmitTypeClass cannot be invoked without 'new'
improvein-challenge-nestjs-1  |     at new CreateActorDto (/usr/local/apps/myapp/build/src/features/actor/actors.model.js:65:42)
improvein-challenge-nestjs-1  |     at TransformOperationExecutor.transform (/usr/local/apps/myapp/node_modules/src/TransformOperationExecutor.ts:160:22)
improvein-challenge-nestjs-1  |     at ClassTransformer.plainToInstance (/usr/local/apps/myapp/node_modules/src/ClassTransformer.ts:77:21)
improvein-challenge-nestjs-1  |     at Object.plainToClass (/usr/local/apps/myapp/node_modules/src/index.ts:71:27)
improvein-challenge-nestjs-1  |     at ValidationPipe.transform (/usr/local/apps/myapp/node_modules/@nestjs/common/pipes/validation.pipe.js:60:39)
improvein-challenge-nestjs-1  |     at /usr/local/apps/myapp/node_modules/@nestjs/core/pipes/pipes-consumer.js:16:33
improvein-challenge-nestjs-1  |     at processTicksAndRejections (node:internal/process/task_queues:95:5)

actors.controller

import {
  Body,
  Controller,
  Headers,
  HttpStatus,
  Logger,
  Post,
  UseGuards,
} from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiBody,
  ApiConflictResponse,
  ApiCreatedResponse,
  ApiExtraModels,
  ApiTags,
  ApiUnauthorizedResponse,
  getSchemaPath,
} from '@nestjs/swagger';
import { ActorsService } from './actors.service';
import { CreateActorDto, CreateActorResponse } from './actors.model';
import { Actor } from './actor.entity';
import BaseResponse from '../../models/base.response.model';
import BaseExceptionResponse from '../../models/base.exception.response.model';
import { ApiTagsEnum } from '../../enums/api.tags.enum';

@Controller('actors')
export class ActorsController {
  constructor(private readonly actorsService: ActorsService) {}

  @ApiExtraModels(BaseResponse, CreateActorResponse)
  @ApiCreatedResponse({
    schema: {
      allOf: [
        { $ref: getSchemaPath(BaseResponse) },
        {
          properties: {
            content: {
              type: 'array',
              items: { $ref: getSchemaPath(CreateActorResponse) },
            },
          },
        },
      ],
    },
    description: 'Actors',
  })
  @ApiUnauthorizedResponse({
    type: BaseExceptionResponse,
    description: 'Unauthorized',
  })
  @ApiConflictResponse({
    type: BaseExceptionResponse,
    description: 'Duplicate actor name',
  })
  @ApiBearerAuth('access-token')
  @ApiTags(ApiTagsEnum.ACTORS)
  @ApiBody({ type: CreateActorDto })
  //@UseGuards(AuthGuard)
  @Post()
  async createActor(
    @Headers() headers,
    @Body() payload: CreateActorDto,
  ): Promise<BaseResponse<CreateActorResponse>> {
    const response: Actor = await this.actorsService.createActor(payload);
    Logger.log(response);
    return new BaseResponse(
      HttpStatus.CREATED,
      'Actor',
      new CreateActorResponse(response),
    );
  }
}

actors.model

import { ApiProperty, OmitType } from '@nestjs/swagger';
import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
import { Actor } from './actor.entity';

export class BaseActor {
  @ApiProperty()
  id: number;

  @ApiProperty({
    type: 'string',
    required: false,
    example: new Date().toLocaleDateString(),
  })
  @IsNotEmpty()
  @IsString()
  birthDate: string;

  @IsNotEmpty()
  @IsString()
  @ApiProperty({ type: 'string', minLength: 1, required: true })
  name: string;

  @IsOptional()
  @IsString()
  @ApiProperty({ type: 'string', minLength: 1, required: false })
  nationality?: string;
}
export class CreateActorDto extends OmitType(BaseActor, ['id']) {}

export class CreateActorResponse extends BaseActor {
  constructor(actor: Actor) {
    super();
    Object.assign(this, actor);
  }
}

设备依赖项:

"devDependencies": {
      "@nestjs/cli": "^10.0.3",
      "@nestjs/schematics": "^10.0.1",
      "@nestjs/testing": "^10.0.2",
      "@types/express": "^4.17.13",
      "@types/jest": "29.5.1",
      "@types/node": "^16.11.10",
      "@types/supertest": "^2.0.11",
      "@typescript-eslint/eslint-plugin": "^5.0.0",
      "@typescript-eslint/parser": "^5.0.0",
      "eslint": "^8.0.1",
      "eslint-config-prettier": "^8.3.0",
      "eslint-plugin-prettier": "^4.0.0",
      "jest": "29.5.0",
      "prettier": "^2.3.2",
      "source-map-support": "^0.5.20",
      "supertest": "^6.1.3",
      "ts-jest": "29.1.0",
      "ts-loader": "^9.2.3",
      "ts-node": "10.7.0",
      "tsconfig-paths": "4.2.0",
      "typescript": "4.5.2"
   },
jhiyze9q

jhiyze9q1#

https://bobbyhadz.com/blog/typescript-class-constructor-cannot-be-invoked-without-new
在TypeScript中,如果没有“new”,就无法调用类构造函数当tslog.json中的target属性设置为低于es6,或者在没有new运算符的情况下示例化类时,会出现“Class constructor cannot be invoked without new”错误。
要解决这个错误,请将target设置为es6,并在示例化类时使用new运算符。
你应该做的第一件事是打开你的tslog.json文件,并确保目标设置为es6或更新。
tsconfig.json

"target": "es6",

相关问题