2

我尝试使用类转换器,但我做不到。我还使用 type-graphql 和 @typegoose/typegoose 这是我的代码:

我的装饰器

import { Transform } from 'class-transformer';

export function Trim() {
  console.log('DECORATOR');

  return Transform(({ value }: { value: string }) => {
    console.log('value: ', value);
    return value.trim();
  });
}

我的输入类型

import { IsEmail } from 'class-validator';
import { InputType, Field } from 'type-graphql';
import { User } from '../Entities/User';
import { Trim } from '../../Decorators/Sanitize';

@InputType({ description: 'Input for user creation' })
export class AddUserInput implements Partial<User> {
  @Field()
  @Trim()
  @IsEmail({ domain_specific_validation: true, allow_utf8_local_part: false })
  email!: string;
}

我的解析器

import { Arg, Mutation, Resolver } from 'type-graphql';
import { User } from '../Entities/User';
import { AddUserInput } from '../Types/UsersInputs';

@Resolver(() => User)
export class UserResolvers {
  @Mutation(() => String, { description: 'Register an admin' })
  async createAccount(@Arg('data') data: AddUserInput): Promise<string> {
    console.log({ ...data });
    return data.email;
  }
}

我的实体

import { prop, getModelForClass } from '@typegoose/typegoose';
import { ObjectType, Field } from 'type-graphql';

@ObjectType({ description: 'User model' })
export class User {
  @Field({ description: 'The user email' })
  @prop({ required: true, unique: true, match: [/\S+@\S+\.\S+/, 'is invalid'] })
  email!: string;
}

export const UserModel = getModelForClass(User, {
  schemaOptions: { timestamps: true }
});

我的请求

POST http://localhost:5000/app HTTP/1.1
Content-Type: application/json
X-REQUEST-TYPE: GraphQL

mutation 
{
   createAccount (data : {
       email: "   email@gmail.com    ",
   })
}

问题是console.log('value: ', value)内部的 Transform 函数永远不会被调用,我的电子邮件也没有被修剪。

console.log('DECORATOR')当我发出请求时也不会调用,而只是在服务器启动时调用一次。

谢谢 !

4

1 回答 1

0

Typegoose 将类转换为 mongoose 模式和模型,除了 mongoose 提供的验证/转换之外,它不应用任何验证/转换,因此class-transformer只有在直接使用类并使用其函数时才会调用装饰器。(喜欢plainToClassclassToPlain

在您的情况下,最好使用PropOptionsget & setpre-hooks

作为说明,typegoose 提供了使用 class-transformer 与 typegoose 类集成示例的指南: class-transformer,只是为了表明它可以像普通类一样使用。

class-transformer另请注意,由于文档中提到的问题,目前建议不要使用它。

于 2022-01-14T23:06:04.217 回答