Nascent Personality Manifestation

    fastify-express
    TypeScript icon, indicating that this package has built-in type declarations

    0.3.3 • Public • Published

    fastify-express

    CI NPM version Known Vulnerabilities js-standard-style

    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.

    Install

    npm i fastify-express
    

    Usage

    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)

    Add a complete application

    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)

    Encapsulation support

    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')())
    }

    Hooks and middlewares

    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')
      })
    }

    Restrict middleware execution to a certain path(s)

    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')))
    }

    TypeScript support

    To use this module with TypeScript, make sure to install @types/express.

    Middlewares alternatives

    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

    License

    Licensed under MIT.
    express license

    Install

    npm i fastify-express

    DownloadsWeekly Downloads

    7,328

    Version

    0.3.3

    License

    MIT

    Unpacked Size

    49 kB

    Total Files

    15

    Last publish

    Collaborators

    • zekth
    • starptech
    • delvedor
    • matteo.collina
    • allevo
    • jsumners
    • ethan_arrowood
    • eomm
    • fox1t
    • salmanm
    • davidmarkclements
    • airhorns
    • kibertoad
    • climba03003