node.js - class-transformer fungerar inte: Transform-funktionen anropas inte


Jag försöker använda class-transformer men jag kan inte göra det. Jag använder också type-graphql och @typegoose/typegoose. Här är min kod:

Min Dekoratör :

import { Transform } from 'class-transformer';

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

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

Min InputType :

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;
}

Min Resolver :

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;
  }
}

Min enhet :

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 }
});

Min förfrågan :

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

mutation 
{
   createAccount (data : {
       email: "   [email     ",
   })
}

Problemet är att console.log('value: ', value) inuti Transform-funktionen aldrig kallas och min e-postadress inte är trimmas.

Också console.log('DECORATOR') anropas inte när jag gör förfrågan utan bara en gång när servern startar.

Tack!

Svar #1

Typegoose transpilerar klasser till mongoose-scheman och modeller, det tillämpar ingen validering/transformation förutom de som mongoose tillhandahåller, så dina class-transformer-dekorationer skulle bara anropas när du använder klassen direkt och använder dess funktioner. (som plainToClass och classToPlain)

I ditt fall skulle det vara bättre att antingen använda PropOptions get & set eller pre-hooks.

Som en notering tillhandahåller typegoose en guide för att använda class-transformer med typegoose-klasser Integrations Exempel: class-transformer, bara för att visa att det kan användas som vanliga klasser.

Observera också att det för närvarande rekommenderas att inte använda class-transformer på grund av de nämnda problemen i dokumentationen.