Fastify barebone GraphQL adapter. Queries are cached on reuse to reduce the overhead of query parsing and validation. fastify-gql supports a Just-In-Time compiler via graphql-jit.
npm i fastify fastify-gql
'use strict'
const Fastify = require('fastify')
const GQL = require('fastify-gql')
const app = Fastify()
const schema = `
type Query {
add(x: Int, y: Int): Int
}
`
const resolvers = {
Query: {
add: async (_, { x, y }) => x + y
}
}
app.register(GQL, {
schema,
resolvers
})
app.get('/', async function (req, reply) {
const query = '{ add(x: 2, y: 2) }'
return reply.graphql(query)
})
app.listen(3000)
See test.js for more examples, docs are coming.
'use strict'
const Fastify = require('fastify')
const GQL = require('fastify-gql')
const { makeExecutableSchema } = require('graphq-tools')
const app = Fastify()
const typeDefs = `
type Query {
add(x: Int, y: Int): Int
}
`
const resolvers = {
Query: {
add: async (_, { x, y }) => x + y
}
}
app.register(GQL, {
schema: makeExecutableSchema({ typeDefs, resolvers })
})
app.get('/', async function (req, reply) {
const query = '{ add(x: 2, y: 2) }'
return reply.graphql(query)
})
app.listen(3000)
fastify-gql supports the following options:
schema
: String or schema definition. The graphql schema. The string will be parsed.resolvers
: Object. The graphql resolvers.graphiql
: boolean. Serve GraphiQL on/graphiql
ifroutes
istrue
.jit
: Intenger. The minimum number of execution a query needs to be executed before being jit'ed.routes
: boolean. Serves the Default:true
. A graphql endpoint is exposed at/graphql
.prefix
: String. Change the route prefix of the graphql endpoint if enabled.defineMutation
: Boolean. Add the empty Mutation definition if schema is not defined (Default:false
).errorHandler
:Function
ย orboolean
. Change the default error handler (Default:true
). Note: If a custom error handler is defined, it should return the standardized response format according to GraphQL spec.
Executed the GraphQL query passed via query string parameters. The supported query string parameters are:
query
, the GraphQL query.operationName
, the operation name to execute contained in the query.variables
, a JSON object containing the variables for the query.
Executes the GraphQL query or mutation described in the body. The payload must conform to the following JSON schema:
{
type: 'object',
properties: {
query: {
type: 'string',
description: 'the GraphQL query'
},
operationName: {
type: 'string'
},
variables: {
type: ['object', 'null'],
additionalProperties: true
}
}
}
Serves GraphiQL if enabled by the options.
fastify-gql adds the following decorators.
Decorate Server with a
graphql
method.
It calls the upstream graphql()
method with the
defined schema, and it adds { app }
to the context.
const Fastify = require('fastify')
const GQL = require('fastify-gql')
const app = Fastify()
const schema = `
type Query {
add(x: Int, y: Int): Int
}
`
const resolvers = {
Query: {
add: async (_, { x, y }) => x + y
}
}
app.register(GQL, {
schema,
resolvers
})
async function run () {
// needed so that graphql is defined
await app.ready()
const query = '{ add(x: 2, y: 2) }'
const res = await app.graphql(query)
console.log(res)
// prints:
//
// {
// data: {
// add: 4
// }
// }
}
run()
It is possible to add schemas and resolvers in separate fastify plugins, like so:
const Fastify = require('fastify')
const GQL = require('fastify-gql')
const app = Fastify()
const schema = `
extend type Query {
add(x: Int, y: Int): Int
}
`
const resolvers = {
Query: {
add: async (_, { x, y }) => x + y
}
}
app.register(GQL)
app.register(async function (app) {
app.graphql.extendSchema(schema)
app.graphql.defineResolvers(resolvers)
})
async function run () {
// needed so that graphql is defined
await app.ready()
const query = '{ add(x: 2, y: 2) }'
const res = await app.graphql(query)
console.log(res)
// prints:
//
// {
// data: {
// add: 4
// }
// }
}
run()
Decorate Reply with a
graphql
method.
It calls the upstream graphql()
function with the
defined schema, and it adds { app, reply }
to the context.
const Fastify = require('fastify')
const GQL = require('fastify-gql')
const app = Fastify()
const schema = `
type Query {
add(x: Int, y: Int): Int
}
`
const resolvers = {
add: async ({ x, y }) => x + y
}
app.register(GQL, {
schema,
resolvers
})
app.get('/', async function (req, reply) {
const query = '{ add(x: 2, y: 2) }'
return reply.graphql(query)
})
async function run () {
const res = await app.inject({
method: 'GET',
url: '/'
})
console.log(JSON.parse(res.body), {
data: {
add: 4
}
})
}
run()
MIT