PayU / openapi-validator-middleware

Input validation using Swagger (Open API) and ajv

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Error with external $ref pointers in open api 3

Fillosof opened this issue · comments

Hi guys.
Recently update from 'swagger 2.0' to 'open api 3'
I used external $ref pointers in my swagger file like this:

paths:
  /countries:
    $ref: './validator/countries.yaml#/routes/base'

For 'swagger 2.0' it's working perfectly fine but for 'open api 3' it throws an error

TypeError: Cannot read property 'countries.yaml#' of undefined

It began working if we change $ref to this style:

    $ref: './validator/countries.yaml/routes/base'

But this is nonconventional use of the $ref that doesn't support by the other libraries.

Is there any solutions for this Issue?

Hi @Fillosof,

Thanks for reporting the problem.

Can you please provide the stack of the error and also if possible definition files for reproducing the problem.

Thank you @kobik for the quick answer.
Here Error stack:

TypeError: Cannot read property 'countries.yaml#' of undefined
  at /home/api/node_modules/json-schema-deref-sync/lib/utils.js:84:17
  at Array.reduce (<anonymous>)
  at Object.getRefPathValue (/home/api/node_modules/json-schema-deref-sync/lib/utils.js:83:15)
  at getRefSchema (/home/api/node_modules/json-schema-deref-sync/lib/index.js:99:18)
  at Object.<anonymous> (/home/api/node_modules/json-schema-deref-sync/lib/index.js:236:24)
  at walker (/home/api/node_modules/traverse/index.js:190:22)
  at /home/api/node_modules/traverse/index.js:208:29
  at Array.forEach (<anonymous>)
  at forEach (/home/api/node_modules/traverse/index.js:298:31)
  at walker (/home/api/node_modules/traverse/index.js:203:13)
  at /home/api/node_modules/traverse/index.js:208:29
  at Array.forEach (<anonymous>)
  at forEach (/home/api/node_modules/traverse/index.js:298:31)
  at walker (/home/api/node_modules/traverse/index.js:203:13)
  at walk (/home/api/node_modules/traverse/index.js:226:7)
  at Traverse.forEach (/home/api/node_modules/traverse/index.js:50:18)
  at derefSchema (/home/api/node_modules/json-schema-deref-sync/lib/index.js:223:27)
  at deref (/home/api/node_modules/json-schema-deref-sync/lib/index.js:310:13)
  at Object.buildSchemaSync (/home/api/node_modules/api-schema-builder/src/index.js:35:26)
  at Object.init (/home/api/node_modules/express-ajv-swagger-validation/src/middleware.js:25:32)
  at Object.<anonymous> (/home/api/dist/server.js:21:28)
  at Generator.next (<anonymous>)

and swagger files: link

Thanks @Fillosof, the error is coming from json-schema-deref-sync.

I'll investigate this further.

@Fillosof are you sure it's working with OIA2?
Do you mean that you've being using the same document, just in OIA2 format?

From what I see the problem is even bigger as json-schema-deref-sync supports loading only refs to json files and not yaml ones.
This would require us to rethink of how to handle dereferencing properly.

@kobik I think issue somewhere in the parser.
Here old swagger 2.0 files.
It's yaml too but work without any issues.

It is indeed json-schema-deref-sync not handling yaml files.
You can see the issue I've opened here and the PR for fixing this issue here, although I'm not sure the maintainer would like to add this functionality.

Thank you @kobik
Then all its left is to pray and believe in a bright future.
Because in another case I need precompile swagger file, and its make it 4x bigger, thats slow down startup time by 2-3 sec.((((

Hi @kobik @Fillosof, it appears you have found the root cause and thanks for the effort. Just want to let you know I had the same issue after upgrading to 1.0.8 but it worked well with 0.9.0.

@superliuwr Thanks man, you save my day))))
But as I check it's don't support nullable: true parameters in the type definition((((
So I still need, wait for the update to fully move to OAS 3 (((

@Fillosof, until my fix gets merged, you can achieve nullable like behavior by adding null to the supported types of the property.

timezone:
  type:
    - 'string'
    - 'null'

Quick update,
Waiting for json-schema-deref-sync devs to publish a new version with my fix.
In the meanwhile I've prepared a PR in api-schema-builder.

@kobik Thank You, now I had a hope to clear a mess, that I created to make it work

If you'd like a better json ref resolver, we've got a fantastic one over at stoplightio/json-ref-resolver.

It's powering everything throughout Studio, Prism, Spectral, etc., and is as performant as it is powerful.