Javascript Nestjs:即使主体验证失败,也会上载图像
首先,我为我的英语不好道歉 我有一个接受PUT请求的方法,它接收一个文件和BlogModel。当我从前端提交表单时,BlogModel的验证失败,文件仍然被上传 梅因酒店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
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');
}