kogosoftwarellc / open-api

A Monorepo of various packages to power OpenAPI in node
MIT License
892 stars 235 forks source link

[ft. request] openapi-response-validator - allow access to response param in errorTransformer #875

Open webketje opened 1 year ago

webketje commented 1 year ago

Context

Feature

Allow access to response param in errorTransformer so the error can be more informative. As a work-around I overwrite the validateResponse method to 'cache' the last response on validator.lastTarget, so I can log the erroneous value together with the rest of the error:

const validator = new OpenAPIResponseValidator({
  components,
  responses: { '200': components.responses.Data },
  definitions: components.schemas,
  errorTransformer: function(openapiError, ajvError) {
    const keypath = openapiError.path.replace(/\//g, '.')
    const pathparts = keypath.split('.')
    let value = validator.lastTarget
      for (let i = 0; i < pathparts.length; i++) {
        if (!value) break
        value = value[pathparts[i]]
      }
    return `Error: Target ${keypath} ${openapiError.message}. Target ${keypath} value is: ${JSON.stringify(value, null, 2)}`
  }
})

// overwrite and store last validated target for error reporting
validator.validateResponse = function(statusCode, context) {
  validator.lastTarget = context
  return OpenAPIResponseValidator.default.prototype.validateResponse.call(this, statusCode, context)
}

console.log(validator.validateResponse(invalidData))
// {
//  message: 'The response was not valid.',
//  errors: [
//    'Error: Target data.items.2.instance must be object. Target data.items.2.instance value is: true'
//  ]
// }
jsdevel commented 1 year ago

plz submit a pr