Fast and low overhead web framework, for Node.js
Why
An efficient server implies a lower cost of the infrastructure, a better responsiveness under load and happy users. How can you efficiently handle the resources of your server, knowing that you are serving the highest number of requests as possible, without sacrificing security validations and handy development?
Enter Fastify. Fastify is a web framework highly focused on providing the best developer experience with the least overhead and a powerful plugin architecture. It is inspired by Hapi and Express and as far as we know, it is one of the fastest web frameworks in town.
Who is using Fastify?
Fastify is proudly powering a large ecosystem of organisations and products out there.
Discover more organisations using Fastify. Do want your organisation to be featured here?
Quick start
Get fastify with NPM:
npm install fastify
Then create server.js
and add the following content:
// Require the framework and instantiate it
const fastify = require('fastify')()
// Declare a route
fastify.get('/', (request, reply) => {
reply.send({ hello: 'world' })
})
// Run the server!
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
fastify.log.info(`server listening on ${fastify.server.address().port}`)
})
// Require the framework and instantiate it
const fastify = require('fastify')()
// Declare a route
fastify.get('/', async (request, reply) => {
return { hello: 'world' }
})
// Run the server!
const start = async () => {
try {
await fastify.listen(3000)
fastify.log.info(`server listening on ${fastify.server.address().port}`)
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
Finally, launch the server with:
node server
and you can test it with:
curl http://localhost:3000
Request/Response validation and hooks
Of course, Fastify can do much more than this.
For example, you can easily provide input and output validation using JSON Schema and perform specific operation before the handler is executed:
const fastify = require('fastify')()
fastify.route({
method: 'GET',
url: '/',
schema: {
// request needs to have a querystring with a `name` parameter
querystring: {
name: { type: 'string' }
},
// the response needs to be an object with an `hello` property of type 'string'
response: {
200: {
type: 'object',
properties: {
hello: { type: 'string' }
}
}
}
},
// this function is executed for every request before the handler is executed
beforeHandler: (request, reply, done) => {
// E.g. check authentication
done()
},
handler: (request, reply) => {
reply.send({ hello: 'world' })
}
})
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
fastify.log.info(`server listening on ${fastify.server.address().port}`)
})
const fastify = require('fastify')()
fastify.route({
method: 'GET',
url: '/',
schema: {
// request needs to have a querystring with a `name` parameter
querystring: {
name: { type: 'string' }
},
// the response needs to be an object with an `hello` property of type 'string'
response: {
200: {
type: 'object',
properties: {
hello: { type: 'string' }
}
}
}
},
// this function is executed for every request before the handler is executed
beforeHandler: async (request, reply) => {
// E.g. check authentication
},
handler: async (request, reply) => {
return { hello: 'world' }
}
})
const start = async () => {
try {
await fastify.listen(3000)
fastify.log.info(`server listening on ${fastify.server.address().port}`)
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
Visit the Documentation to learn more about all the features that Fastify has to offer.
Core features
These are the main features and principles on which fastify has been built:
- Highly performant: as far as we know, Fastify is one of the fastest web frameworks in town, depending on the code complexity we can serve up to 30 thousand requests per second.
- Extendible: Fastify is fully extensible via its hooks, plugins and decorators.
- Schema based: even if it is not mandatory we recommend to use JSON Schema to validate your routes and serialize your outputs, internally Fastify compiles the schema in an highly performant function.
- Logging: logs are extremely important but are costly; we chose the best logger to almost remove this cost, Pino!
- Developer friendly: the framework is built to be very expressive and to help developers in their daily use, without sacrificing performance and security.
A fast web framework
Leveraging our experience with Node.js performance, Fastify has been built from the ground up to be as fast as possible. Have a look at our benchmarks section to compare fastify performance to other common web frameworks.
Ecosystem
Fastify has an ever-growing ecosystem of plugins. Probably there is already a plugin for your favourite database or template language. Have a look at the Ecosystem page to navigate through the currently available plugins. Can't you find the plugin you are looking for? No problem, it's very easy to write one!
The team
In alphabetical order
Lead Maintainers
Collaborators
Acknowlegments
This project is kindly sponsored by:
Also thanks to: