node.jsswaggerfastifyfastify-swagger

@fastify/swagger returning 404


I'm trying to get @Fastify/swagger working on a basic Fastify project, but everytime I try to get to the swagger page it just returns as a 404.

server.js:

const fastify = require('fastify')({logger: true})
const PORT = 3000

fastify.register(require('./routes/items'));

fastify.register(require('@fastify/swagger'), {
    routePrefix: '/documentation',
    exposeRoute: true,
    swagger: {
        info: {
            title: { title: 'test'}
        }
    }
})

    
const start = async() => {
    try {
        await fastify.listen(PORT)
        fastify.swagger()
    } catch (error) {
        fastify.log.error(error)
        process.exit(1)
    }
}

start()

Visiting 127.0.0.1/documentation

In my package.json I have the following dependencies:

  "dependencies": {
    "@fastify/swagger": "^8.1.0",
    "@fastify/view": "^7.1.2",
    "fastify": "^4.9.2",
    "uuid": "^9.0.0"
  }

The errors returned are: :"Route GET:/documentation not found" :{"statusCode":404}


Solution

  • It was missing the @fastify/swagger-ui package.

    Additionally the load order is important. Routes in the server.js need to come after requiring swagger, like so:

    fastify.register(require('@fastify/swagger'), {})
    fastify.register(require('@fastify/swagger-ui'), {
        routePrefix: '/docs',
        uiConfig: {
            docExpansion: 'full',
            deepLinking: false
        },
        uiHooks: {
            onRequest: function (request, reply, next) { next() },
            preHandler: function (request, reply, next) { next() }
        },
        staticCSP: true,
        transformStaticCSP: (header) => header,
        transformSpecification: (swaggerObject, request, reply) => { return swaggerObject },
        transformSpecificationClone: true
    })
    
    fastify.register(require('./routes/item'))
    

    Swagger displaying end points for items in the browser