Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nestjs:即使主体验证失败,也会上载图像_Javascript_Nestjs - Fatal编程技术网

Javascript Nestjs:即使主体验证失败,也会上载图像

Javascript Nestjs:即使主体验证失败,也会上载图像,javascript,nestjs,Javascript,Nestjs,首先,我为我的英语不好道歉 我有一个接受PUT请求的方法,它接收一个文件和BlogModel。当我从前端提交表单时,BlogModel的验证失败,文件仍然被上传 梅因酒店 import { NestFactory } from '@nestjs/core'; import { AppModule } from './core/app.module'; import { ValidationPipe } from '@nestjs/common'; import { join } from 'pa

首先,我为我的英语不好道歉

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

梅因酒店

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();
add-blog.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;
}
index.hbs


提交
$(文档).ready(函数(){
$(“#表格”)。关于('submit',函数(e){
e、 预防默认值();
常量数据=$(this).serializeArray()
const data_from_array={}
var formData=new formData()
$.map(数据,函数(n,i){
append(n['name'],n['value'])
});
常量文件=$('input[type=“file”])[0]。文件[0]
append('缩略图',文件)
常量配置={
标题:{
“内容类型”:“多部分/表单数据”
}
}
轴心http://localhost:3000/blogs,formData,config)。然后(res=>{
console.log(res)
}).catch(错误=>{
console.log(错误响应)
})
});
})

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

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

也有同样的问题,我最后做的是在调用我的服务之前手动验证字段

仅仅为了验证文件而实现拦截器似乎有些过分

    async createUser(@Response() res, @UploadedFile() avatar, @Body() user: CreateUserDTO) {
        // FileUploads are not validated in the Pipe
        if (_.isNil(avatar)) {
            throw new BadRequestException(['avatar photo is required'], 'Validation Failed');
        }


请同时显示UploadedFile decorator。@Thomas thanx对于响应,UploadedFile decorator是从Nestjs框架导出的。FileInterceptor()decorator是从@nestjs/platform express包导出的,而@UploadedFile()是从@nestjs/common导出的。
    async createUser(@Response() res, @UploadedFile() avatar, @Body() user: CreateUserDTO) {
        // FileUploads are not validated in the Pipe
        if (_.isNil(avatar)) {
            throw new BadRequestException(['avatar photo is required'], 'Validation Failed');
        }