Consider this endpoint in my API:
@Post('/convert')
@UseInterceptors(FileInterceptor('image'))
convert(
@UploadedFile() image: any,
@Body(
new ValidationPipe({
validationError: {
target: false,
},
// this is set to true so the validator will return a class-based payload
transform: true,
// this is set because the validator needs a tranformed payload into a class-based
// object, otherwise nothing will be validated
transformOptions: { enableImplicitConversion: true },
}),
)
parameters: Parameters,
) {
return this.converterService.start(image, parameters);
}
The body of the request, which is set to parameters
argument, contains a property called laserMode
that should be a boolean type, it is validated like such on the parameters DTO:
@IsDefined()
@IsBoolean()
public laserMode: boolean;
now the strange part, when a send a request from PostMan where:
laserMode = false
laserMode = cool
(a string other the boolean value)
I noticed that laserMode
is always set to true and this is after the validation process is completed because when I console.log the instance of Parameter in the constructor of the class
export class Parameters {
...
constructor() {
console.log('this :', this);
}
...
}
I don't see the property!
Note: when
laserMode
is removed from the request, the expected validation errors are returned (should be defined, should be boolean value).
// the logged instance 'this' in the constructor
this : Parameters {
toolDiameter: 1,
sensitivity: 0.95,
scaleAxes: 200,
deepStep: -1,
whiteZ: 0,
blackZ: -2,
safeZ: 2,
workFeedRate: 3000,
idleFeedRate: 1200,
laserPowerOn: 'M04',
laserPowerOff: 'M05',
invest: Invest { x: false, y: true }
}
// the logged laserMode value in the endpoint handler in the controller
parameters.laserMode in controller : true
// the logged laser value from the service
parameters.laserMode in service : true
- misspelling is checked
- same result is noticed when using a Vue app instead of postman. So!!?