【问题标题】:how to prevent file upload when body validation fails in nestjsnestjs中正文验证失败时如何防止文件上传
【发布时间】:2022-11-22 09:17:30
【问题描述】:

在 nestjs 应用程序中上传文件之前,我要验证多部分表单。问题是,如果正文验证失败,我不想上传文件。 这是我编写代码的方式。

// User controller method for create user with upload image
@Post()
@UseInterceptors(FileInterceptor('image'))
create(
    @Body() userInput: CreateUserDto,
    @UploadedFile(
        new ParseFilePipe({
          validators: [
             // some validator here
          ]
        })
    ) image: Express.Multer.File,
) {
    return this.userService.create({ ...userInput, image: image.path });
}

尝试了很多方法来解决这个问题,但没有找到任何解决方案

【问题讨论】:

    标签: node.js validation file-upload nestjs nest


    【解决方案1】:

    拦截器在管道之前运行,因此无法保存文件不是除非您在服务中自行管理,否则就会发生。但是,另一个选项可能是自定义异常过滤器,unlinks 文件出错,这样您就不必担心上传后的问题

    【讨论】:

    • 你是对的,但我如何检查异常过滤器中的验证错误。我做不到,我似乎无法在抛出验证错误之前检查它们
    • 我编辑了我的代码,我想纠正一个验证器类,如果存在,它将检查验证错误。如果存在,则取消链接文件。
    • ParseFilePipe 会抛出 BadRequestException,因此您可以验证这是您在过滤器中收到的错误类型
    • 我是在 BadRequestException 上使用异常过滤器完成的,谢谢
    【解决方案2】:

    这就是我创建整个过滤器的方式

    import { isArray } from 'lodash';
    import {
      ExceptionFilter,
      Catch,
      ArgumentsHost,
      BadRequestException,
    } from '@nestjs/common';
    import { Request, Response } from 'express';
    import * as fs from 'fs';
    
    @Catch(BadRequestException)
    export class DeleteFileOnErrorFilter implements ExceptionFilter {
      catch(exception: BadRequestException, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const response = ctx.getResponse<Response>();
        const request = ctx.getRequest<Request>();
        const status = exception.getStatus();
    
        const getFiles = (files: Express.Multer.File[] | unknown | undefined) => {
          if (!files) return [];
          if (isArray(files)) return files;
          return Object.values(files);
        };
    
        const filePaths = getFiles(request.files);
    
        for (const file of filePaths) {
          fs.unlink(file.path, (err) => {
            if (err) {
              console.error(err);
              return err;
            }
          });
        }
        response.status(status).json(exception.getResponse());
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多