krakenjs / swaggerize-express

Design-driven apis with swagger 2.0 and express.
Other
354 stars 81 forks source link

v5 alpha fails to run #134

Closed gonenduk closed 6 years ago

gonenduk commented 6 years ago

Tried to use the new v5 alpha version. Didn't change any code except the package.json file with the new version. When running, got the following error: Unhandled rejection TypeError: Cannot read property 'length' of undefined at makeExpressRoute (/Users/gonen.dukas/Workspace/basejs/node_modules/swaggerize-express/lib/expressroutes.js:44:41) at /Users/gonen.dukas/Workspace/basejs/node_modules/swaggerize-express/lib/expressroutes.js:87:9 at Array.forEach (native) at expressroutes (/Users/gonen.dukas/Workspace/basejs/node_modules/swaggerize-express/lib/expressroutes.js:86:12) at routeBuilder.then.routeObj (/Users/gonen.dukas/Workspace/basejs/node_modules/swaggerize-express/lib/index.js:72:13) at tryCatcher (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:512:31) at Promise._settlePromise (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:569:18) at Promise._settlePromise0 (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:693:18) at Promise._fulfill (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:638:18) at Promise._resolveCallback (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:432:57) at Promise._settlePromiseFromHandler (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:524:17) at Promise._settlePromise (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:569:18) at Promise._settlePromise0 (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/Users/gonen.dukas/Workspace/basejs/node_modules/bluebird/js/release/promise.js:693:18)

subeeshcbabu-zz commented 6 years ago

Version 5 would be a breaking change. To avail the swagger parser module (async parser), there need to be some adjustments done in the way the application bootstrap would be happening.

https://github.com/krakenjs/swaggerize-express/blob/v5.x/CHANGELOG.md#500

Can you try to make the below change to the server.js

Start the server (or listen to port) only on route event emitted by the app. Route builder is an async api, now capable of parsing and validating remote $ref in swagger spec, so the app/server need to wait for the route event before processing requests.

Reference - https://github.com/krakenjs/swaggerize-express/blob/v5.x/test/test-swaggerize.js#L22

Also we need to add a document/examples on the usage of the 5.x version, detailing the breaking changes and new features.

gonenduk commented 6 years ago

Hi Again - thanks for the prompt response! I understand that the server should start the listener only after the route event is triggered. However, I get the same crash even if I don't start the server at all. So I debugged the code and I think I found the issue. In lib/expressroutes.js line 42:

validators = [];

for (var i = 0; i < route.validators.length; ++i) { validators.push(MakeValidator(route.validators[i], route.consumes)); }

route.validators is undefined, therefor is not an array and doesn't have length. I think the for statement should be run only if you have validations on the route. I tested it and it does solve the crash. I created a pull request with the fix.

subeeshcbabu-zz commented 6 years ago

cool. thanks. lemme check that.

subeeshcbabu-zz commented 6 years ago

merged the PR.