Автоматически генерируемые сообщения об ошибках для Express-Validator - PullRequest
2 голосов
/ 26 сентября 2019

Я хочу создать Express API и подтвердить ввод запроса с помощью express-validator.В настоящее время это мое промежуточное ПО для проверки

protected validate = async (request: Request, response: Response, next: NextFunction): Promise<void> => {
    const validationErrors: Result<ValidationError> = validationResult(request);

    if (!validationErrors.isEmpty()) {
        response.status(422).json({ errors: validationErrors.array() });
    } else {
        next();
    }
};

, и мои основные настройки проверки выглядят так:

public persist = [
    body('username')
        .isString()
        .withMessage('username must be of type string.')
        .isLength({ min: 1 })
        .withMessage('username must be at least one character long.')
        .exists()
        .withMessage('username is required.'),
    body('password')
        .isString()
        .withMessage('password must be of type string.')
        .isLength({ min: 1 })
        .withMessage('password must be at least one character long.')
        .exists()
        .withMessage('password is required.'),
    this.validate,
];

Когда я вызываю POST /users для создания нового пользователя, я получаю подробный ответ об ошибке при недействительностивходы.Когда я удаляю все пользовательские сообщения об ошибках, я получаю этот ответ

[
    {
        "msg": "Invalid value",
        "param": "username",
        "location": "body"
    },
    {
        "msg": "Invalid value",
        "param": "password",
        "location": "body"
    }
]

Есть ли способ получать автоматически генерируемые сообщения об ошибках или мне действительно нужно писать эти сообщения об ошибках самостоятельно?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

По сути, валидатор пытается сообщить вам, где, по его мнению, он обнаружил ошибку, и поскольку у него нет пользовательских строк ошибок, он использует (довольно некрасивую) схему «элемент / местоположение».

Подход 1

Наиболее разумным способом было бы иметь настраиваемое сообщение об ошибке для каждого поля.Видя, что сообщения об ошибках являются довольно повторяющимися, имело бы смысл вывести их из определения валидатора и, возможно, создать очень простую функцию «получения», которая выполняла бы некоторые базовые шаблоны.Затем ваш код становится немного лучше:

const MSG_TYPE_STR = '{{field}} must be of type string.'

function getMessage(fieldName: string, msgID: string): string {
   // Templating magic happens here, Regex or whatever other method you prefer
}
...

body('username')
        .isString()
        .withMessage(getMessage('username', MSG_TYPE_STR)

....

Таким образом, вы все равно будете получать красиво отформатированные сообщения об ошибках, и вам не придется копировать и вставлять одну и ту же строку снова и снова

Подход 2

Вы могли бы предположительно добавить постобработку к ошибке валидации (т.е. взять уродливый вывод и сделать некоторые вычисления и преобразовать его в более хороший вывод).Это был бы значительно более сложный подход, так как вам пришлось бы разбить правила на атомарные проверки, и ваша схема проверки стала очень длинной, и все же это довольно трудоемкий

подход 3

Это не столько «подход», сколько предложение - вы можете переключиться на другой валидатор, например, Joi, который имеет гораздо более разумную логику по умолчанию для сообщений об ошибках

1 голос
/ 27 сентября 2019

Я согласен с предложениями Алекса, особенно в части Джой .

Просто хотел бы упомянуть еще одну возможность.Передать клиенту коды ошибок.Пример:

usernameTooShort

Это может быть обработано в клиенте и будет полезно, если в какой-то момент вы решите добавить локализацию в свое приложение.У вас будет объект ключ-значение на внешнем интерфейсе, который обрабатывает сообщения в зависимости от языка, который выбрал ваш пользователь.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...