Skip to content
This repository has been archived by the owner on Mar 6, 2024. It is now read-only.

check for null objects #92

Closed
wants to merge 4 commits into from
Closed

Conversation

meytal127
Copy link

when an object value is null

@coveralls
Copy link

coveralls commented Jul 11, 2017

Coverage Status

Changes Unknown when pulling 2d6b764 on meytal127:master into ** on BigstickCarpet:master**.

@JamesMessinger
Copy link
Member

Hi @meytal127. Thanks for the PR, but can you please explain the issue that it fixes? It's not clear to me why there should be special handling of null values in the parseObject() function. Nulls and other "empty" values are handled by the getValueToValidate() function already

@meytal127
Copy link
Author

meytal127 commented Jul 11, 2017

Hi @BigstickCarpet,
example from the test I added: {Name: 'Fido', Type: 'dog', Address: null}
The value null is valid value, and it continues to check the fields of the object Address.
When I add the null check it acts like the value is undefined.
Maybe You can suggest a better solution?

Without the fix we receive the following error:

cannot PATCH /api/pets/fido (500)<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Error: The "PetData" body parameter is invalid ({"Name":"Fido","Type":"dog","Address":null}) 
Cannot read property 'Street' of null
    at ono (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/ono/lib/index.js:62:17)
    at parseParameter (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:146:11)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:93:18
    at Array.some (native)
    at parseBodyParam (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:77:10)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at parseFormDataParams (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:68:3)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at parseSimpleParams (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:46:3)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/multer/index.js:218:19
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at rawParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/raw.js:58:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/urlencoded.js:82:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at textParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/text.js:60:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:262:16)
    at done (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:251:7)
    at IncomingMessage.onEnd (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:307:7)
    at emitNone (events.js:86:13)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9) 

TypeError: Cannot read property 'Street' of null
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:509:20
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3073:15
    at baseForOwn (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:2046:14)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3043:18
    at Function.<anonymous> (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3346:13)
    at parseObject (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:508:5)
    at JsonSchema.parse (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:92:14)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:512:42
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3073:15
    at baseForOwn (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:2046:14)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3043:18
    at Function.<anonymous> (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/lodash/index.js:3346:13)
    at parseObject (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:508:5)
    at JsonSchema.parse (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/helpers/json-schema.js:92:14)
    at parseParameter (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:143:35)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:93:18
    at Array.some (native)
    at parseBodyParam (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:77:10)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at parseFormDataParams (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:68:3)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at parseSimpleParams (/Users/meytals/git/Dev/ms/swagger-express-middleware/lib/param-parser.js:46:3)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/multer/index.js:218:19
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at rawParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/raw.js:58:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/urlencoded.js:82:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at textParser (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/types/text.js:60:7)
    at Layer.handle [as handle_request] (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:317:13)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/express/lib/router/index.js:275:10)
    at /Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:262:16)
    at done (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:251:7)
    at IncomingMessage.onEnd (/Users/meytals/git/Dev/ms/swagger-express-middleware/node_modules/raw-body/index.js:307:7)
    at emitNone (events.js:86:13)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)</pre>
</body>
</html>

Error: cannot PATCH /api/pets/fido (500)<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Error: The "PetData" body parameter is invalid ({"Name":"Fido","Type":"dog","Address":null}) 
Cannot read property 'Street' of null
    at ono (node_modules/ono/lib/index.js:62:17)
    at parseParameter (lib/param-parser.js:146:11)
    at lib/param-parser.js:93:18
    at Array.some (native)
    at parseBodyParam (lib/param-parser.js:77:10)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at parseFormDataParams (lib/param-parser.js:68:3)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at parseSimpleParams (lib/param-parser.js:46:3)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at node_modules/multer/index.js:218:19
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at rawParser (node_modules/body-parser/lib/types/raw.js:58:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (node_modules/body-parser/lib/types/urlencoded.js:82:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at textParser (node_modules/body-parser/lib/types/text.js:60:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (node_modules/raw-body/index.js:262:16)
    at done (node_modules/raw-body/index.js:251:7)
    at IncomingMessage.onEnd (node_modules/raw-body/index.js:307:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9) 

TypeError: Cannot read property 'Street' of null
    at lib/helpers/json-schema.js:509:20
    at node_modules/lodash/index.js:3073:15
    at baseForOwn (node_modules/lodash/index.js:2046:14)
    at node_modules/lodash/index.js:3043:18
    at Function.<anonymous> (node_modules/lodash/index.js:3346:13)
    at parseObject (lib/helpers/json-schema.js:508:5)
    at JsonSchema.parse (lib/helpers/json-schema.js:92:14)
    at lib/helpers/json-schema.js:512:42
    at node_modules/lodash/index.js:3073:15
    at baseForOwn (node_modules/lodash/index.js:2046:14)
    at node_modules/lodash/index.js:3043:18
    at Function.<anonymous> (node_modules/lodash/index.js:3346:13)
    at parseObject (lib/helpers/json-schema.js:508:5)
    at JsonSchema.parse (lib/helpers/json-schema.js:92:14)
    at parseParameter (lib/param-parser.js:143:35)
    at lib/param-parser.js:93:18
    at Array.some (native)
    at parseBodyParam (lib/param-parser.js:77:10)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at parseFormDataParams (lib/param-parser.js:68:3)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at parseSimpleParams (lib/param-parser.js:46:3)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at node_modules/multer/index.js:218:19
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at rawParser (node_modules/body-parser/lib/types/raw.js:58:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (node_modules/body-parser/lib/types/urlencoded.js:82:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at textParser (node_modules/body-parser/lib/types/text.js:60:7)
    at Layer.handle [as handle_request] (node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (node_modules/express/lib/router/index.js:317:13)
    at node_modules/express/lib/router/index.js:284:7
    at Function.process_params (node_modules/express/lib/router/index.js:335:12)
    at next (node_modules/express/lib/router/index.js:275:10)
    at node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (node_modules/raw-body/index.js:262:16)
    at done (node_modules/raw-body/index.js:251:7)
    at IncomingMessage.onEnd (node_modules/raw-body/index.js:307:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)</pre>
</body>
</html>

    at Test.<anonymous> (tests/fixtures/helper.js:121:23)
    at Test.assert (node_modules/supertest/lib/test.js:156:6)
    at Server.assert (node_modules/supertest/lib/test.js:127:12)
    at emitCloseNT (net.js:1558:8)
    at _combinedTickCallback (internal/process/next_tick.js:77:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)

@coveralls
Copy link

coveralls commented Jul 11, 2017

Coverage Status

Changes Unknown when pulling 9a689f6 on meytal127:master into ** on BigstickCarpet:master**.

@JamesMessinger
Copy link
Member

@meytal127 - Ah, I see what you're talking about. However, there are two problems with this fix.

  1. It only fixes it for type: "object", not for other types, which would be inconsistent and confusing behavior

  2. The Swagger 2.0 spec does not allow nullable fields for any type, including objects. I'm currently working on adding support for OpenAPI 3.0, which does support nullable fields.

@meytal127
Copy link
Author

meytal127 commented Jul 11, 2017 via email

@JamesMessinger
Copy link
Member

JamesMessinger commented Jul 12, 2017

@meytal127 - You can workaround this using standard Express middleware. You could add a middleware function to remove any null fields from the request body before the parseRequest() middleware, or you could add err-handling middleware after the parseRequest() middleware and specifically ignore null-field errors.

Here's a sample API that reproduces the problem you're experiencing: https://runkit.com/bigstickcarpet/swagger-express-middleware-pr-92/1.0.0

You can send a POST request to that API with address: null using the following curl command:

curl -X POST \
  https://swagger-express-middleware-pr-92-nr9aw9u4ye5j.runkit.sh/ \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
  "name": "Fido",
  "type": "dog",
  "address": null
}'

When you run that command, you get the following error response, due to the address: null:

400 Error: The "body" body parameter is invalid ({"name":"Fido","type":"dog","address":null}) 
400 Error: JSON Schema validation error. 
Data path: "/address" 
Schema path: "/properties/address/type" 
Invalid type: null (expected object) 
400 Error: JSON Schema validation error. 
Data path: "/address" 
Schema path: "/properties/address/type" 
Invalid type: null (expected object) 
Error
    at new ValidationError (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:1461:12)
    at ValidatorContext.createError (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:359:14)
    at ValidatorContext.validateType (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:751:14)
    at ValidatorContext.validateBasic (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:721:19)
    at ValidatorContext.validateAll (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:599:19)
    at ValidatorContext.validateObjectProperties (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:1010:21)
    at ValidatorContext.validateObject (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:961:11)
    at ValidatorContext.validateAll (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:603:11)
    at Object.validate (/app/available_modules/1499773931656/swagger-express-middleware/node_modules/tv4/tv4.js:1573:24)
    at jsonValidate (/app/available_modules/1499773931656/swagger-express-middleware/lib/helpers/json-schema.js:201:11)

Now, compare that to this API, which is the same as the previous one, but with some error-handling middleware added after the parseRequest() middleware: https://runkit.com/bigstickcarpet/swagger-express-middleware-pr-92/2.0.0

You can send a POST request to that API with address: null using the following curl command. This is the same as the previous curl command. Only the URL has changed to call the new API that includes the error-handling middleware:

curl -X POST \
  https://swagger-express-middleware-pr-92-hffies7jjrq0.runkit.sh/ \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
  "name": "Fido",
  "type": "dog",
  "address": null
}'

And when you run that command, you'll see that it now succeeds. This is because I "caught" the null-field error and ignored it.

@meytal127
Copy link
Author

@BigstickCarpet Thank you for the answer!
I will check that.

@fredtma
Copy link

fredtma commented Apr 18, 2019

Hi,
Running into the null issue as well.
in the file lib/helpers/json-schema.js would be great to add the dataType null

let dataTypes = ["string", "number", "integer", "boolean", "array", "object", "file", "null"];

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants