【问题标题】:What is a metatype in nestjs?nestjs 中的元类型是什么?
【发布时间】:2020-04-12 10:26:16
【问题描述】:

阅读官方的nestjs文档,我遇到了ValidationPipe的以下实现:

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';

@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  async transform(value: any, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToClass(metatype, value);
    const errors = await validate(object);
    if (errors.length > 0) {
      throw new BadRequestException('Validation failed');
    }
    return value;
  }

  private toValidate(metatype: Function): boolean {
    const types: Function[] = [String, Boolean, Number, Array, Object];
    return !types.includes(metatype);
  }
}

我不明白 transform 方法中的逻辑。如果有人能逐行解释这一段,那就太好了。我认为问题源于我不太了解ArgumentMetadata 是什么以及它来自哪里。

【问题讨论】:

    标签: typescript nestjs


    【解决方案1】:

    Metatype 是传递到管道中的对象的类类型,通过反射和一些魔术来检索 but if you wanna look here's the code

    基本上,如果您有@Body() body: MyCustomClass,那么元类型将等于MyCustomClass。这是plainToClass 方法所必需的,因此它知道将JSON 序列化到哪个类。如果您使用 JavaScript 或不提供类型,则元类型将是未定义的

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 2015-06-22
      • 2014-09-10
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多