使用 class-validator 包在 Nest.js 创建用于图像上传的自定义验证器

2023-12-25

我想验证 Nest.js 中文件的 mimetype。但我不能。

@UseInterceptors(FileInterceptor('image'))
  @Post('upload_profile_photo')
  async uploadProfilePhoto(@UploadedFile() image: UploadImageDto) {
    return image;
}

上传图片Dto.ts

import { IsImageFile } from '../validators/IsImageFile';

export class UploadImageDto {
  @Validate(IsImageFile)
  mimetype: string;
}

IsImageFile.ts

@ValidatorConstraint({ async: false, name: 'image' })
export class IsImageFile implements ValidatorConstraintInterface {
  validate(mimeType: string, args: ValidationArguments) {
    // nothing is written on the console
    console.log(mimeType);

    const acceptMimeTypes = ['image/png', 'image/jpeg'];

    const fileType = acceptMimeTypes.find((type) => type === mimeType);

    if (!fileType) return false;

    return true;
  }

  defaultMessage(validationArguments?: ValidationArguments): string {
    return 'The file type was not accepted.';
  }
}

我的自定义装饰器不执行。有人帮我吗?


您可以定义一个执行验证的函数,并在您希望验证的属性上方的注释中使用它,如下所示:

import { ValidationOptions, registerDecorator } from 'class-validator';

export function IsImageFile(options?: ValidationOptions) {
  return (object, propertyName: string) => {
    registerDecorator({
      target: object.constructor,
      propertyName,
      options,
      validator: {
        validate(mimeType) {
          const acceptMimeTypes = ['image/png', 'image/jpeg'];
          const fileType = acceptMimeTypes.find((type) => type === mimeType);
          return !fileType;
        },
      },
    });
  };
}
export class UploadImageDto {
  @IsImageFile({message: invalid mime type received})
  mimetype: string;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 class-validator 包在 Nest.js 创建用于图像上传的自定义验证器 的相关文章

随机推荐

  • Git merge 不使用默认合并消息,使用默认消息打开编辑器

    我怎样才能强迫git merge使用默认合并消息而不是用所述消息加载我的编辑器 我没有列出编辑器git config l 所以我不确定为什么它会打开一个编辑器 经过一番挖掘后找到了答案 编辑 根据马克的建议 这是最好的方法 git conf
  • 在 Objective-C 中将八进制字符串转换为十进制?

    我试图在 Objective C 中进行二进制 八进制 十进制和十六进制之间的转换 我在将八进制转换为十进制时遇到问题 我已经尝试过以下方法 NSString decString NSString stringWithFormat d 07
  • 如何编写“每组最大 n”类型查询,但带有附加条件?

    昨天我问了一个关于进行 每组最大 n 类型查询的问题 当时不知道它被称为 每组最大 n 除了我问如何获得每组最少的值 表结构如下 type name value 1 item1 1 1 item2 20 2 item3 0 3 item4
  • Android AlarmManager 是否处理夏令时更改?

    我正在 Android 中构建一个闹钟应用程序 AlarmManager 是否自动处理夏季和冬季之间的时钟变化 还是我需要明确管理 编辑 如果在重复间隔与时钟变化交叉的地方设置闹钟 是否需要重新安排该闹钟 与接受的答案所说的相反 我在我的应
  • 单元测试执行速度(每秒测试多少次?)

    您的单元测试的目标执行率是多少 每秒测试次数 对于单个单元测试来说多长时间才算太长 我很想知道人们是否有任何特定的阈值来确定他们的测试是否太慢 或者只是当长时间运行的测试套件的摩擦让你变得更好时 最后 当您确实决定测试需要运行得更快时 您使
  • 在表单提交时触发谷歌分析事件

    我正在尝试将分析事件跟踪添加到 onclick 事件中 以便在表单上提交输入 我尝试了多个不同的示例 并参考了几个不同的 SO 帖子来达到这一点 我可以通过 onclick 来提交表单或触发跟踪事件 但不能同时执行两者 第一个例子 向控制台
  • python 2.7 无法再安装 pip 了吗?

    我想使用与 python 2 7 但不是 3 8 兼容的 python 脚本 我需要 pip 才能使脚本正常工作 但看起来我无法再安装 pip 了 我尝试使用 get pip py 但它不起作用 user DESKTOP J9T7UBF g
  • 如何访问工件的 BUILDNUMBER 是 Visual Studio Team Services 发布管理

    我需要访问 Visual Studio Team Services 发布管理中的工件的内部版本号 以便可以将该值发送到任务 我的工件名称中有一个空格 Production Branch 我一直在阅读以下文档 https www visual
  • SwiftUI 节标题 - 使用非大写?

    创建列表如下 struct ContentView View var body some View List Section header Text Header Text Row 1 Text Row 2 listStyle PlainL
  • 避免重复的浏览器选项卡或窗口 (window.open())

    在 Javascript 中 我们可以使用 window open 打开新的浏览器窗口或选项卡 但如果选项卡已打开 则应仅突出显示该选项卡 它不应该打开重复的选项卡 怎么做 The 第二个参数 https developer mozilla
  • 使用 ggplot facet_grid 在不同条件下绘制相同变量的散点图?

    我想将数据帧的同一列与具有不同行值的点相关联 例如 在iris数据框 我想制作三个散点图进行比较Petal Length of virginica与那个versicolor setosa with virginica and versico
  • 数据库服务器或数据库表中的用户

    我遇到了一个关于客户端服务器应用程序设计的有趣问题 我们有一个基于浏览器的管理应用程序 有许多用户使用该系统 显然 在该应用程序中我们有一个用户管理模块 我一直认为在数据库中拥有一个用户表来保存所有登录详细信息就足够了 然而 一位资深开发人
  • 在java中将HTML表格写入PDF [重复]

    这个问题在这里已经有答案了 可能的重复 将 HTML 文件转换为 PDF https stackoverflow com questions 633780 converting html files to pdf 从 XML 或 HTML
  • 使用变量 self 与 this 之间的区别

    我一直在努力将这些 this 与 bind 方法一起使用以及变量 self this 的使用 在得到两个不同的结果时 所以我错过了一个概念 案例如下 Defining a callback class to use after retrie
  • 使用 posix 而不是 fork/execv 运行 bash

    我有一个 CLI 其中一个命令是进入 Linux bash shell 这是使用 fork 和 execv 执行此操作的代码 if pid fork lt 0 syslog debug LOG ERR Could not fork if p
  • Delphi 和 ADO:日期时间到字符串的转换

    我使用 Delphi 2006 和 ADO 连接到 MS Access 数据库 我检索的一些字段是日期字段 在 Access 中格式为 中日期 即 20 4 2010 但是我必须将它们作为字符串检索 FValue FAccessADOQue
  • 获取父对象的值

    有没有办法从对象的父对象获取键值 在下面的例子中 我想结合urlParent with section const linkItems id 1 name Home Page urlParent home subItems subId 1
  • 应用程序配置错误,无法使用发布密钥哈希进行 Facebook 登录

    我已将 Facebook 集成到我的应用程序中 我用调试密钥哈希测试了我的应用程序在模拟器和我的设备 HTC 中都正常 当我为签名的 APK 尝试发布密钥哈希时 我的设备 HTC One X 中总是出现 应用程序配置错误 无法登录 Face
  • 脚本错误:溢出:'CInt' - VBScript

    将计数器添加到 5 位以上的下一个数字时 有溢出 如果是 5 位数字 则不会出现错误 我用的是VBScript Counter CInt Counter CInt Qty 我想在分子中使用 7 位数字 如何解决这个问题呢 很确定这个问题之前
  • 使用 class-validator 包在 Nest.js 创建用于图像上传的自定义验证器

    我想验证 Nest js 中文件的 mimetype 但我不能 UseInterceptors FileInterceptor image Post upload profile photo async uploadProfilePhoto