Skip to content

GraphQL (Apollo) → Go ecosystem

gox does not ship a GraphQL server — use a dedicated Go library. This guide maps common Apollo/GraphQL-js patterns.

Library choice

Node.jsGoNotes
apollo-servergqlgenSchema-first, code generation
graphql (reference)graphql-goSchema in Go structs
@apollo/clienthasura/go-graphql-clientClient only

Recommendation: gqlgen for new APIs; graphql-go for minimal schemas.

Server setup

Apollo (Node)

js
const { ApolloServer } = require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');

const server = new ApolloServer({ typeDefs, resolvers });
startStandaloneServer(server, { listen: { port: 4000 } });

gqlgen (Go)

go
import (
    "net/http"
    "github.com/99designs/gqlgen/graphql/handler"
    "github.com/99designs/gqlgen/graphql/playground"
)

srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &resolver.Resolver{}}))
http.Handle("/", playground.Handler("GraphQL", "/query"))
http.Handle("/query", srv)
http.ListenAndServe(":4000", nil)

Resolvers

Apollogqlgen
Query: { user: (_, { id }) => getUser(id) }func (r *queryResolver) User(ctx context.Context, id string) (*User, error)
Context per requestctx context.Context first parameter
DataLoaderUse dataloadgen or hand-rolled batching

With gox/http

Mount gqlgen on a gox sub-router:

go
import goxhttp "github.com/sahilkhaire/gox/http"

app := goxhttp.New()
gql := app.Router()
gql.Mount("/query", srv) // http.Handler from gqlgen
app.Mount("/graphql", gql)
app.Listen(":4000")

Subscriptions

Node.jsGo
graphql-ws / Apollo subscriptionsgqlgen subscriptions + WebSocket transport
socket.io roomsUse gox/ws for raw WebSocket; gqlgen handles GraphQL subscription protocol

See ws.md for WebSocket basics.

Further reading

MIT Licensed · Built for Node.js developers moving to Go