JSONAPI middleware for middy
npm install middy-jsonapibash
npm i middy middy-jsonapi
`$3
See below for full example.#### Accept Header
The
Accept is required to be application/vnd.api+json
`
.use(
httpContentNegotiation({
availableMediaTypes: ['application/vnd.api+json']
})
)
`#### Validation
This middleware expects
400 Bad Request to be returned from the validator middleware provided from middy/middleware or equivalent ajv error format.Features
$3
- Parses include, fields, sort, page query parameters
- See middy-jsonapi-filter-* for filter parsing [TODO]$3
- Format errors to meet standard
- Supports page-based and offset-based pagination auto generate links from meta.total & meta.countDeployment
`javascript
const middy = require('middy')
const {
cache,
cors,
doNotWaitForEmptyEventLoop,
functionShield,
httpEventNormalizer,
httpHeaderNormalizer,
httpContentNegotiation,
httpSecurityHeaders,
jsonBodyParser,
secretsManager,
ssm,
urlEncodeBodyParser,
validator,
warmup
} = require('middy/middlewares')
const jsonapi = require('middy-jsonapi')
const authorization = require('../middleware/authorization')const ajvOptions = {
v5: true,
format: 'full',
coerceTypes: 'array',
allErrors: true,
useDefaults: true,
$data: true
}
const meta = require('../../package.json')
const response = {
jsonapi: { version:'1.0' },
meta: {
version:
v${meta.version},
copyright: meta.copyright,
authors: meta.authors,
now: new Date().toISOString()
}
}// cache
const myStorage = {}
const getValue = key => Promise.resolve(myStorage[key])
const setValue = (key, value) => {
myStorage[key] = value
return Promise.resolve()
}
module.exports = (app, { inputSchema, outputSchema }) =>
middy(app)
.use(warmup())
//.use(ssm({
// cache: true,
// setToContext: true
// }))
//.use(secretsManager({
// cache: true
//}))
.use(functionShield({
policy: { disable_analytics: true }
}))
.use(doNotWaitForEmptyEventLoop())
.use(httpEventNormalizer())
.use(httpHeaderNormalizer())
.use(urlEncodeBodyParser())
.use(jsonBodyParser())
.use(httpSecurityHeaders())
.use(cors())
//.use(cache())
.use(jsonapi({ response })) // Replaces: httpErrorHandler
.use(
httpContentNegotiation({
availableLanguages: ['en-CA', 'fr-CA'],
availableMediaTypes: ['application/vnd.api+json']
})
)
//.use(authorization())
.use(validator({ inputSchema, outputSchema, ajvOptions }))
`$3
We recommend kitsu-core for deserializing `javascript
const { deserialise } = require('kitsu-core/node')const jsonapiDeserialise = body => {
deserialise(body)
return body
}
``