Проблема в том, что когда я отправляю "RUNNING", я все равно получаю 200 вместо 400.
кажется, что вы используете строку (!) "RUNNING "как значение в полезной нагрузке вашего запроса как таковое:
{ appState: "RUNNING" }
В этом случае IsEnum
и NotEquals
оба считают полезную нагрузку действительной.
Почему это так?
Прежде всего цифра c перечисления обратно отображаются с помощью машинописи , поэтому ваше перечисление внутренне (как javascript объект) представляется следующим образом:
{
'0': 'SUCCESS',
'1': 'ERROR',
'2': 'RUNNING',
SUCCESS: 0,
ERROR: 1,
RUNNING: 2
}
Теперь класс-валидатор isEnum()
кодируется следующим образом: :
isEnum(value: unknown, entity: any): boolean {
const enumValues = Object.keys(entity)
.map(k => entity[k]);
return enumValues.indexOf(value) >= 0;
}
и, поскольку перечисление имеет обратное отображение, isEnum('RUNNNING', AppState)
вернет true.
В то же время NotEquals
, который закодирован как таковой ...
notEquals(value: unknown, comparison: unknown): boolean {
return value !== comparison;
}
будет сравнивать строку 'RUNNING' с AppState.RUNNING
(что равно 2
) и также пришли к выводу, что это действительно с 'RUNNING' != 2
.
Итак, у вас есть, почему полезная нагрузка { appState: "RUNNING" }
приведет к 200 вместо кода состояния 400.
Как я могу предотвратить это поведение?
Значение enum AppState.RUNNING
равно 2
, поэтому, когда вы делаете запрос, вы должны использовать значение цифра c 2
в вашем полезная нагрузка:
{ appState: 2 }
В приведенном выше случае валидатор NotEquals
класса-валидатора затем корректно отклонит запрос с ответом, содержащим:
"constraints": {
"notEquals": "appState should not be equal to 2"
}