Serve
Deployment
Node.js Frameworks
Fastify

Integration with Fastify

💡

This page is currently under construction and expected to change. Please feel free to reach out to us directly in case you are having any troubles.

Fastify is one of the popular HTTP server frameworks for Node.js. It is a very simple, yet powerful framework that is easy to learn and use.

You can easily integrate GraphQL Mesh with Fastify.

So you can benefit from the powerful plugins of Fastify ecosystem with GraphQL Mesh. See the ecosystem

Example

import fastify, { FastifyReply, FastifyRequest } from 'fastify'
import { createServeRuntime } from '@graphql-mesh/serve-runtime'
 
// This is the fastify instance you have created
const app = fastify({ logger: true })
 
const serveRuntime = createServeRuntime<{
  req: FastifyRequest
  reply: FastifyReply
}>({
  // Integrate Fastify logger
  logging: {
    debug: (...args) => args.forEach(arg => app.log.debug(arg)),
    info: (...args) => args.forEach(arg => app.log.info(arg)),
    warn: (...args) => args.forEach(arg => app.log.warn(arg)),
    error: (...args) => args.forEach(arg => app.log.error(arg))
  }
})
 
/**
 * We pass the incoming HTTP request to GraphQL Mesh
 * and handle the response using Fastify's `reply` API
 * Learn more about `reply` https://www.fastify.io/docs/latest/Reply/
 **/
app.route({
  // Bind to the Mesh's endpoint to avoid rendering on any path
  url: serveRuntime.graphqlEndpoint,
  method: ['GET', 'POST', 'OPTIONS'],
  handler: async (req, reply) => {
    // Second parameter adds Fastify's `req` and `reply` to the GraphQL Context
    const response = await serveRuntime.handleNodeRequestAndResponse(req, reply, {
      req,
      reply
    })
    response.headers.forEach((value, key) => {
      reply.header(key, value)
    })
 
    reply.status(response.status)
 
    reply.send(response.body)
 
    return reply
  }
})
 
app.listen(4000)

Add dummy content type parser for File Uploads

Fastify needs to be aware of GraphQL Mesh will handle multipart/form-data requests because otherwise it will throw an error something like Unsupported media type.

// This will allow Fastify to forward multipart requests to GraphQL Mesh
app.addContentTypeParser('multipart/form-data', {}, (req, payload, done) => done(null))