2

I can't seem to understand what is going on here, or what i'm doing wrong, I've read other threads with similar issues, but didn't find one like mine (people are always asking about validating typed Arrays)

Here goes the class i want to validate.


export class CreateActivityDto {
   
    //other un-problematic validated properties

    @IsArray()
    @ValidateNested({ each: true })
    @Type(() => Plan)  
    plan: Plan[]  //this one works fine
    

    @IsObject()
    @IsDefined()
    @Type(() => Location) //imported from class-transformer
    location: Location
}
class Location {
    @IsString()
    @IsNotEmpty()
    address: string
    @IsObject()
    @Type(() => LatLng) //imported from class-transformer
    coords: LatLng
}

class LatLng {
    @IsNumber()
    lng: number
    @IsNumber()
    lat: number
}

Weirdly enough, if i declare location as an array of location (location: Location[]) it doesn't throw the error

This is being thrown in RunTime, few miliseconds after the server tries to bootstrap

[6:25:19 pm] Found 0 errors. Watching for file changes.

[fullDirHere]\src\activity\dtos\activity.dto.ts:52
location: Location
              ^
ReferenceError: Cannot access 'Location' before initialization

and this is my main.ts file

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { cors: true });
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true,
    transform: true,
    transformOptions: {
      enableImplicitConversion: true
    }
  }))
  await app.listen(3000);
}
bootstrap();

In case there's any doubts, this an example of a valid object i could receive

{
"location": {
          "address": "Av. Corrientes 2003, Buenos Aires, Argentina",
          "coords": {
                    "lat": -34.6042967,
                    "lng": -58.39546360000001
               },
...other props,
}

2 Answers 2

10

If you change the order of declaration of these classes, it should work fine. I tested this on my local also:


class LatLng {
    @IsNumber()
    lng: number;
    @IsNumber()
    lat: number;
}

class Location {
    @IsString()
    @IsNotEmpty()
    address: string;
    @IsObject()
    @Type(() => LatLng) //imported from class-transformer
    coords: LatLng;
}
export class CreateActivityDto {
    //other un-problematic validated properties

    @IsArray()
    @ValidateNested({ each: true })
    @Type(() => Plan)  
    plan: Plan[]  //this one works fine

    @IsObject()
    @IsDefined()
    @Type(() => Location) //imported from class-transformer
    location: Location;
}

As you might know, the decorators are usually run before other piece of code.

Sign up to request clarification or add additional context in comments.

Comments

0

For me using Relation from 'typeorm' fixed the issue:

Before:

    @IsObject()
    @IsDefined()
    @Type(() => Location) 
    location: Location;

After:

    @IsObject()
    @IsDefined()
    @Type(() => Location) //imported from class-transformer
    location: Relation<Location>;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.