This plugin adds full Express compatibility to Fastify, it exposes the same use
function of Express, and it allows you to use any Express middleware or application.
Note | This plugin should not be used as a long-term solution, it aims to help you have a smooth transition from Express to Fastify, but you should migrate your Express specific code to Fastify over time. |
---|
npm i fastify-express
Register the plugin and start using your Express middlewares.
const Fastify = require('fastify')
async function build () {
const fastify = Fastify()
await fastify.register(require('fastify-express'))
// do you know we also have cors support?
// https://github.com/fastify/fastify-cors
fastify.use(require('cors')())
// express.Application is also accessible
fastify.express.disabled('x-powered-by') // true
return fastify
}
build()
.then(fastify => fastify.listen(3000))
.catch(console.log)
You can register an entire Express application and make it work with Fastify.
const fastify = require('fastify')()
const router = require('express').Router()
router.use(function (req, res, next) {
res.setHeader('x-custom', true)
next()
})
router.get('/hello', (req, res) => {
res.status(201)
res.json({ hello: 'world' })
})
router.get('/foo', (req, res) => {
res.status(400)
res.json({ foo: 'bar' })
})
fastify.register(require('fastify-express'))
.after(() => {fastify.use(router)})
fastify.listen(3000, console.log)
The encapsulation works as usual with Fastify, you can register the plugin in a subsystem and your express code will work only inside there, or you can declare the express plugin top level and register a middleware in a nested plugin, and the middleware will be executed only for the nested routes of the specific plugin.
Register the plugin in its own subsystem:
const fastify = require('fastify')()
fastify.register(subsystem)
async function subsystem (fastify, opts) {
await fastify.register(require('fastify-express'))
fastify.use(require('cors')())
}
Register a middleware in a specific plugin:
const fastify = require('fastify')()
fastify
.register(require('fastify-express'))
.register(subsystem)
async function subsystem (fastify, opts) {
fastify.use(require('cors')())
}
Every registered middleware will be run during the onRequest
hook phase, so the registration order is important.
Take a look at the Lifecycle documentation page to understand better how every request is executed.
const fastify = require('fastify')()
fastify
.register(require('fastify-express'))
.register(subsystem)
async function subsystem (fastify, opts) {
fastify.addHook('onRequest', async (req, reply) => {
console.log('first')
})
fastify.use((req, res, next) => {
console.log('second')
next()
})
fastify.addHook('onRequest', async (req, reply) => {
console.log('third')
})
}
If you need to run a middleware only under certain path(s), just pass the path as first parameter to use and you are done!
const fastify = require('fastify')()
const path = require('path')
const serveStatic = require('serve-static')
fastify
.register(require('fastify-express'))
.register(subsystem)
async function subsystem (fastify, opts) {
// Single path
fastify.use('/css', serveStatic(path.join(__dirname, '/assets')))
// Wildcard path
fastify.use('/css/*', serveStatic(path.join(__dirname, '/assets')))
// Multiple paths
fastify.use(['/css', '/js'], serveStatic(path.join(__dirname, '/assets')))
}
To use this module with TypeScript, make sure to install @types/express
.
Fastify offers some alternatives to the most commonly used middlewares, following, you can find a list.
Express Middleware | Fastify Plugin |
---|---|
helmet |
fastify-helmet |
cors |
fastify-cors |
serve-static |
fastify-static |
Licensed under MIT.
express
license