Fastify is a small Node framework for developing back end web apps.
In this article, we’ll look at how to create back end apps with Fastify.
Serialization
We can change the way that responses are serialized.
To do this, we write:
const fastify = require('fastify')({})
const schema = {
response: {
'2xx': {
type: 'object',
properties: {
value: { type: 'string' },
otherValue: { type: 'boolean' }
}
},
201: {
value: { type: 'string' }
}
}
}
fastify.get('/', { schema }, (request, reply) => {
reply.send({ value: 1, otherValue: 'foo' })
})
const start = async () => {
try {
await fastify.listen(3000, '0.0.0.0')
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
We add the response schema with the schema.response property.
We specify the response data type and structure for each status code.
The type specifies the data type of the response.
properties specifies the data type for the properties in the response.
In the GET / request handler, we call reply.send with an object with the properties listed in the schema.
And the properties will automatically be converted to the types specified in the schema.
So we get:
{"value":"1","otherValue":true}
when we make a GET request to / .
We can also specify the response schema in the request.
To do this, we write:
const fastify = require('fastify')({})
fastify.setSerializerCompiler(({ schema, method, url, httpStatus }) => {
return data => JSON.stringify(data)
})
fastify.get('/', {
handler (req, reply) {
reply.send({ id: 1, name: 'Foo', image: 'BIG IMAGE' })
},
schema: {
response: {
'2xx': {
id: { type: 'number' },
name: { type: 'string' }
}
}
}
})
const start = async () => {
try {
await fastify.listen(3000, '0.0.0.0')
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
We call fastify.setSerializerCompiler to compile the response.
And we add the schema to the fastify.get method to specify the response schema.
Error Handling
We can change how errors are handled when validation fails.
For example, we can write:
const fastify = require('fastify')({})
const schema = {
body: {
type: 'object',
properties: {
name: { type: 'string' }
},
required: ['name']
}
}
fastify.post('/', { schema, attachValidation: true }, function (req, reply) {
if (req.validationError) {
reply.code(400).send(req.validationError)
}
else {
reply.send('success')
}
})
const start = async () => {
try {
await fastify.listen(3000, '0.0.0.0')
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
We specify the validation schema.
And in the fastify.post method, we pass in an object with the schema and attachValidation set to true .
We check if there are any validation errors with the req.validationError property.
And we get the validation errors with the req.validationError property.
Conclusion
We can change how responses are serialized and how errors are handled with Fastify.