Skip to Content
SWR 2.0 is out! Read more →

GraphiQL

GraphiQL is an in-browser IDE for writing, validating, and testing GraphQL queries.

You can configure or completely disable GraphiQL with the graphiql option. By default, GraphiQL is only enabled.

Example

import { createServer } from '@graphql-yoga/node'
 
// Provide your schema
const server = createServer({
  graphiql: {
    defaultQuery: /* GraphQL */ `
      query {
        hello
      }
    `
  }
})
// Start the server and explore http://localhost:4000/graphql
server.start()

Disabling GraphiQL

You can disable GraphiQL by simply setting the graphiql option to false.

import { createServer } from '@graphql-yoga/node'
 
// Provide your schema
const server = createServer({ graphiql: false })
 
// Start the server and explore http://localhost:4000/graphql
server.start()
⚠️

Be aware that this does not make your GraphQL server more secure. As long as the introspection and/or the “did you mean x” suggestion feature of GraphQL are enabled.

import { createServer } from '@graphql-yoga/node'
import { useDisableIntrospection } from '@envelop/disable-introspection'
 
// Provide your schema
const server = createServer({
  graphiql: false,
  plugins: [useDisableIntrospection()]
})
 
// Start the server and explore http://localhost:4000/graphql
server.start()

Disabling the “did you mean x” suggestion feature is not possible at the moment (see the corresponding graphql-js GitHub issue).

As a workaround, you can use the maskedError option for masking validation and parse errors.

import { createServer } from '@graphql-yoga/node'
import { useDisableIntrospection } from '@envelop/disable-introspection'
 
// Provide your schema
const server = createServer({
  graphiql: false,
  plugins: [useDisableIntrospection()],
  maskedErrors: {
    handleParseErrors: true,
    handleValidationErrors: true
  }
})
 
// Start the server and explore http://localhost:4000/graphql
server.start()

So if your goal is to avoid unknown actors from reverse-engineering your GraphQL schema and executing arbitary operations, it is highly recommended to use persisted operations. Envelop has the plugin @envelop/persisted-operations that can be used with GraphQL Yoga.

A more detailed guide and example for adding persisted operations to GraphQL Yoga will follow.

Dynamic Options

You can also dynamically set GraphiQL options based on the incoming request. This allows rendering GraphiQL conditionally e.g. based on a header presence or value.

import { createServer } from '@graphql-yoga/node'
 
// Provide your schema
const server = createServer({
  graphiql(request) {
    if (request.headers.get('graphiql-enabled')) {
      return true
    }
    return false
  }
})
 
// Start the server and explore http://localhost:4000/graphql
server.start()

Within the function passed to graphiql you also have access to the serverContext. E.g. on Node.js it contains the http.Request and http.Response objects.

import { createServer } from '@graphql-yoga/node'
 
// Provide your schema
const server = createServer({
  graphiql(request, { req, res }) {
    // access something attached to the request object
    // e.g. an user object added by an auth middleware.
    if (req.user.role === 'admin') {
      return true
    }
    return false
  }
})
 
// Start the server and explore http://localhost:4000/graphql
server.start()

Offline Usage

By default, GraphiQL code is served from a CDN because if we added GraphiQL code inside Yoga, it would end up with huge bundle size and exceed the payload limit for some environments for example (CF Workers, AWS etc.). If you want to use GraphiQL from a local version, you need to install it manually.

And you need to pass imported renderGraphiQL to createServer like below:

import { createServer } from '@graphql-yoga/node'
import { renderGraphiQL } from '@graphql-yoga/render-graphiql'
 
const yoga = createServer({ renderGraphiQL })
 
yoga.start()