Skip to content

Commit 087bd63

Browse files
Merge pull request #332 from wolfgang42/joi-error
Breaking change: Return error when a response item does not validate.
2 parents 3f1496a + 6e38bcb commit 087bd63

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict'
2+
3+
const jsonApi = require('../..')
4+
5+
module.exports = new jsonApi.MemoryHandler()

example/resources/brokenResponse.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict'
2+
3+
const jsonApi = require('../../.')
4+
const brokenResponseHandler = require('../handlers/brokenResponseHandler.js')
5+
6+
jsonApi.define({
7+
namespace: 'json:api',
8+
resource: 'brokenResponse',
9+
description: 'Example demonstrating error handling of broken responses',
10+
handlers: brokenResponseHandler,
11+
searchParams: { },
12+
attributes: {
13+
boolean: jsonApi.Joi.boolean(),
14+
number: jsonApi.Joi.number()
15+
},
16+
examples: [
17+
{
18+
id: 'b3ea78f4-8d03-4708-9945-d58cadc97b04',
19+
type: 'brokenResponse',
20+
boolean: 1,
21+
number: '3'
22+
}
23+
]
24+
})

lib/responseHelper.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@ responseHelper._enforceSchemaOnObject = (item, schema, callback) => {
3434
Joi.validate(item, schema, (err, sanitisedItem) => {
3535
if (err) {
3636
debug.validationError(err.message, JSON.stringify(item))
37-
return callback(null, null)
37+
const res = {
38+
status: '500',
39+
code: 'EINVALIDITEM',
40+
title: 'Item in response does not validate',
41+
detail: {
42+
item: item,
43+
error: err.message
44+
}
45+
}
46+
return callback(res)
3847
}
3948

4049
const dataItem = responseHelper._generateDataItem(sanitisedItem, schema)

test/get-resource-id.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ describe('Testing jsonapi-server', () => {
2020
})
2121
})
2222

23+
it('broken response should error', done => {
24+
const url = 'http://localhost:16006/rest/brokenResponse/b3ea78f4-8d03-4708-9945-d58cadc97b04'
25+
helpers.request({
26+
method: 'GET',
27+
url
28+
}, (err, res, json) => {
29+
assert.equal(err, null)
30+
helpers.validateError(json)
31+
const errors = JSON.parse(json).errors
32+
assert.equal(res.statusCode, '500', 'Expecting 500')
33+
assert.equal(errors.length, 1)
34+
assert.equal(errors[0].code, 'EINVALIDITEM')
35+
assert.equal(errors[0].detail.error, 'child "boolean" fails because ["boolean" must be a boolean]')
36+
done()
37+
})
38+
})
39+
2340
it('valid lookup', done => {
2441
const url = 'http://localhost:16006/rest/articles/de305d54-75b4-431b-adb2-eb6b9e546014'
2542
helpers.request({

0 commit comments

Comments
 (0)