Search code examples
javascriptyupvalidationerror

Yup: How to access the "inner" propriety in ValidationError() method


Yup contain a method name validationError whose one of properties is "inner". Accordingly with the documentation:

in the case of aggregate errors, inner is an array of ValidationErrors throw earlier in the validation chain. When the abortEarly option is false this is where you can inspect each error thrown, alternatively, errors will have all of the messages from each inner error.

However, it's properly working is not quite clear to me. How exactly I do to access this property and use it in my code.

Here, I'm trying to use in this application but it seems not working.

function validator (req, res, next) {

yup.setLocale({
    mixed: {
        default: 'Não é válido',
      }
});

 const schema = yup.object().shape({
    name: yup.string().required("Legendary name is required"),
    type: yup.string().required("Legendary type is required"),
    description: yup.string().required("Legendary description is required").min(10)
});

 let messageError = new yup.ValidationError([`${req.body.name}`, `${req.body.type}`, `${req.body.description}`]);

 if(!schema.isValidSync(req.body, {abortEarly: false})) {
    return res.status(400).json(messageError.inner);
 }

When I run it with insomnia, I get a empty array only.

Can someone help me with this, please ?


Solution

  • ValidationError is thrown is by the validate* methods (validate, validateSync, validateAt, and validateSyncAt) when the validation fails. isValidSync returns a boolean and doesn't throw any errors. Use validateSync and add a catch block to access the validation errors.

    messageError.inner returns an empty array since messageError is a standalone ValidationError object which isn't associated with the schema in any way.

    try {
      schema.validateSync(req.body, { abortEarly: false })
    } catch (err) {
      // err is of type ValidationError
      return res.status(400).json(err.inner)
    }
    
    curl -s -X POST http://localhost:5000/test | jq        
    [
      {
        "name": "ValidationError",
        "path": "name",
        "type": "required",
        "errors": [
          "Legendary name is required"
        ],
        "inner": [],
        "message": "Legendary name is required",
        "params": {
          "path": "name"
        }
      },
      {
        "name": "ValidationError",
        "path": "type",
        "type": "required",
        "errors": [
          "Legendary type is required"
        ],
        "inner": [],
        "message": "Legendary type is required",
        "params": {
          "path": "type"
        }
      },
      {
        "name": "ValidationError",
        "path": "description",
        "type": "required",
        "errors": [
          "Legendary description is required"
        ],
        "inner": [],
        "message": "Legendary description is required",
        "params": {
          "path": "description"
        }
      }
    ]