-
Notifications
You must be signed in to change notification settings - Fork 835
Closed
Description
I'm trying to validate a field which can be missing (or undefined), but if present, cannot be null. Currently it seems that if I have the @IsOptional()
decorator and the value is null, it bypasses any further validation.
I tried making my own decorator similar to @IsOptional()
but got a runtime error:
Error: Cannot find module 'class-validator/types/metadata/ValidationMetadata'
Require stack:
{my modules}
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
at Function.Module._resolveFilename (/Users/stbaldwin/git/unsullied/node_modules/tsconfig-paths/lib/register.js:75:40)
at Function.Module._load (internal/modules/cjs/loader.js:841:27)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at Object.<anonymous> (/Users/stbaldwin/git/unsullied/src/utils/validation/OptionalButNotNull.ts:3:1)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Module.m._compile (/Users/stbaldwin/git/unsullied/node_modules/ts-node/src/index.ts:837:23)
at Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Object.require.extensions.<computed> [as .ts] (/Users/stbaldwin/git/unsullied/node_modules/ts-node/src/index.ts:840:12)
Here is my decorator:
import { ValidationOptions, ValidationTypes, getMetadataStorage } from 'class-validator';
import { ValidationMetadataArgs } from 'class-validator/types/metadata/ValidationMetadataArgs';
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
/**
* Checks if value is missing and if so, ignores all validators.
*/
export function IsOptionalButNotNull(validationOptions?: ValidationOptions): PropertyDecorator {
return function (object: object, propertyName: string | symbol): void {
const args: ValidationMetadataArgs = {
type: ValidationTypes.CONDITIONAL_VALIDATION,
target: object.constructor,
propertyName: String(propertyName),
constraints: [
(object: any, _value: any): boolean => {
return object[propertyName] !== undefined;
}
],
validationOptions: validationOptions
};
getMetadataStorage().addValidationMetadata(new ValidationMetadata(args));
};
}
Is there another solution?
tlan16
Metadata
Metadata
Assignees
Labels
No labels