Nestjs:即使正文验证失败也会上传图像

Ren*_*eef 6 javascript nestjs

首先,我为我糟糕的英语表示歉意。

我有一个接受 PUT 请求的方法,它接收一个文件和 BlogModel。当我从前端提交表单并且 BlogModel 的验证失败时,文件仍然会上传。

主要.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './core/app.module';
import { ValidationPipe } from '@nestjs/common';
import { join } from 'path';
import { NestExpressApplication } from '@nestjs/platform-express';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useStaticAssets(join(__dirname, '..', 'src/public'));
  app.setBaseViewsDir(join(__dirname, '..', 'src/views'));

  app.setViewEngine('hbs');
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

添加博客方法


  @Put()
  @UseInterceptors(FileInterceptor('thumbnail', { storage: BlogStorage }))
  addBlog(@UploadedFile() file, @Body() addBlogModel: AddBlogModel) {
    console.log(file);
  }
Run Code Online (Sandbox Code Playgroud)

添加博客.model.ts

import { IsArray, IsBoolean, IsNotEmpty, IsOptional, IsString, Length } from 'class-validator';
import { Expose } from 'class-transformer';

export class AddBlogModel {
  @IsNotEmpty()
  @IsString()
  title: string;

  @IsString()
  @Length(10, 225)
  @IsOptional()
  introduction: string;

  @IsNotEmpty()
  @IsString()
  content: string;

  @IsBoolean()
  @Expose({name: 'is_published'})
  isPublished: boolean;

  @IsArray()
  @IsNotEmpty()
  tags: string[];

  @IsString()
  @IsNotEmpty()
  category: string;
}
Run Code Online (Sandbox Code Playgroud)

索引.hbs

import { NestFactory } from '@nestjs/core';
import { AppModule } from './core/app.module';
import { ValidationPipe } from '@nestjs/common';
import { join } from 'path';
import { NestExpressApplication } from '@nestjs/platform-express';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useStaticAssets(join(__dirname, '..', 'src/public'));
  app.setBaseViewsDir(join(__dirname, '..', 'src/views'));

  app.setViewEngine('hbs');
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

我希望如果验证失败,文件不会上传。

Jay*_*iel 4

这里发生的事情与 NestJS 请求周期的执行顺序有关,即如何在管道之前调用和触发拦截器。在这种情况下,您将调用文件上传拦截器,让该代码根据需要运行,然后验证您的有效负载,因此即使您有无效的有效负载,您仍然可以上传文件。您可以在此处查看文件上传拦截器并查看该代码的外观。如果您绝对需要文件上传和有效负载位于同一请求中,则始终可以创建自己的验证拦截器而不是管道,并在文件上传拦截器之前运行此验证。否则,您可以向他们提出两个单独的请求。