Neverending Pile of Messages
    Wondering what’s next for npm?Check out our public roadmap! »

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

    3.1.1 • Public • Published

    fastify-sensible

    js-standard-style Node CI

    Defaults for Fastify that everyone can agree on™.
    This plugin adds some useful utilities to your Fastify instance, see the API section to learn more.

    Supports Fastify versions 3.x. Please refer to this branch and related versions for Fastify 2.x compatibility. Please refer to this branch and related versions for Fastify 1.x compatibility.

    Why these APIs are here and not directly into core?
    Because Fastify aims to be as small and focused as possible, every utility that is not essential should be shipped as standalone plugin.

    Install

    npm i fastify-sensible
    

    Usage

    const fastify = require('fastify')()
    fastify.register(require('fastify-sensible'))
    
    fastify.get('/', (req, reply) => {
      reply.notFound()
    })
    
    fastify.get('/async', async (req, reply) => {
      throw fastify.httpErrors.notFound()
    })
    
    fastify.listen(3000)

    API

    fastify.httpErrors

    Object that exposes createError and all the 4xx and 5xx error constructors.

    Usage of 4xx and 5xx error constructors follows the same structure as new createError[code || name]([msg])) in http-errors:

     // the custom message is optional
    const notFoundErr = fastify.httpErrors.notFound('custom message')

    4xx

    • fastify.httpErrors.badRequest()
    • fastify.httpErrors.unauthorized()
    • fastify.httpErrors.paymentRequired()
    • fastify.httpErrors.forbidden()
    • fastify.httpErrors.notFound()
    • fastify.httpErrors.methodNotAllowed()
    • fastify.httpErrors.notAcceptable()
    • fastify.httpErrors.proxyAuthenticationRequired()
    • fastify.httpErrors.requestTimeout()
    • fastify.httpErrors.conflict()
    • fastify.httpErrors.gone()
    • fastify.httpErrors.lengthRequired()
    • fastify.httpErrors.preconditionFailed()
    • fastify.httpErrors.payloadTooLarge()
    • fastify.httpErrors.uriTooLong()
    • fastify.httpErrors.unsupportedMediaType()
    • fastify.httpErrors.rangeNotSatisfiable()
    • fastify.httpErrors.expectationFailed()
    • fastify.httpErrors.imateapot()
    • fastify.httpErrors.misdirectedRequest()
    • fastify.httpErrors.unprocessableEntity()
    • fastify.httpErrors.locked()
    • fastify.httpErrors.failedDependency()
    • fastify.httpErrors.unorderedCollection()
    • fastify.httpErrors.upgradeRequired()
    • fastify.httpErrors.preconditionRequired()
    • fastify.httpErrors.tooManyRequests()
    • fastify.httpErrors.requestHeaderFieldsTooLarge()
    • fastify.httpErrors.unavailableForLegalReasons()

    5xx

    • fastify.httpErrors.internalServerError()
    • fastify.httpErrors.notImplemented()
    • fastify.httpErrors.badGateway()
    • fastify.httpErrors.serviceUnavailable()
    • fastify.httpErrors.gatewayTimeout()
    • fastify.httpErrors.httpVersionNotSupported()
    • fastify.httpErrors.variantAlsoNegotiates()
    • fastify.httpErrors.insufficientStorage()
    • fastify.httpErrors.loopDetected()
    • fastify.httpErrors.bandwidthLimitExceeded()
    • fastify.httpErrors.notExtended()
    • fastify.httpErrors.networkAuthenticationRequired()

    createError

    Usage of createError follows the same structure as createError([status], [message], [properties]) in http-errors:

    var err = fastify.httpErrors.createError(404, 'This video does not exist!')

    reply.[httpError]

    The reply interface is decorated with all the functions declared above, use it is very easy:

    fastify.get('/', (req, reply) => {
      reply.notFound()
    })

    reply.vary

    The reply interface is decorated with jshttp/vary, the API is the same, but you don't need to pass the res object.

    fastify.get('/', (req, reply) => {
      reply.vary('Accept')
      reply.send('ok')
    })

    request.forwarded

    The request interface is decorated with jshttp/forwarded, the API is the same, but you don't need to pass the request object.

    fastify.get('/', (req, reply) => {
      reply.send(req.forwarded())
    })

    request.is

    The request interface is decorated with jshttp/type-is, the API is the same, but you don't need to pass the request object.

    fastify.get('/', (req, reply) => {
      reply.send(req.is(['html', 'json']))
    })

    assert

    Verify if a given condition is true, if not it throws the specified http error.
    Very useful if you work with async routes.

    // the custom message is optional
    fastify.assert(
      req.headers.authorization, 400, 'Missing authorization header'
    )

    The assert API exposes also the following methods:

    • fastify.assert.ok()
    • fastify.assert.equal()
    • fastify.assert.notEqual()
    • fastify.assert.strictEqual()
    • fastify.assert.notStrictEqual()
    • fastify.assert.deepEqual()
    • fastify.assert.notDeepEqual()

    to

    Async await wrapper for easy error handling without try-catch, inspired by await-to-js

    const [err, user] = await fastify.to(
      db.findOne({ user: 'tyrion' })
    )

    Custom error handler

    This plugins also adds a custom error handler which hides the error message in case of 500 errors that are being generated by throwed errors, instead it returns Something went wrong.
    This is especially useful if you are using async routes, where every uncaught error will be sent back to the user (but do not worry, the original error message is logged as error in any case). If needed, it can be disabled by setting the option errorHandler to false.

    If you return a 500 error via the API provided on fastify.httpErrors and reply objects, the custom error message is preserved and returned in the HTTP response body.

    Contributing

    Do you feel there is some utility that everyone can agree on which is not present?
    Open an issue and let's discuss it! Even better a pull request!

    Acknowledgements

    The project name is inspired by vim-sensible, an awesome package that if you use vim you should use too.

    License

    MIT Copyright © 2018 Tomas Della Vedova

    Install

    npm i fastify-sensible

    DownloadsWeekly Downloads

    13,707

    Version

    3.1.1

    License

    MIT

    Unpacked Size

    48 kB

    Total Files

    24

    Last publish

    Collaborators

    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar
    • avatar