Creating a GraphQL Server with Express and Apollo Server

John Au-Yeung - Jan 25 '21 - - Dev Community

Check out my books on Amazon at https://www.amazon.com/John-Au-Yeung/e/B08FT5NT62

Subscribe to my email list now at http://jauyeung.net/subscribe/

Apollo Server is available as a Node package. We can use it to create a server to accept GraphQL requests.

In this article, we’ll look at how to use it with Express to create our own GraphQL server.

Get started with Apollo Server

We get started by installing the express-apollo-server.

To install it with Express, we run:

npm install apollo-server-express express
Enter fullscreen mode Exit fullscreen mode

Then create an index.js file and add:

const express = require('express');  
const { ApolloServer, gql } = require('apollo-server-express');
const books = [  
  {  
    title: 'JavaScript for Dummies',  
    author: 'Jane Smith',  
  },  
  {  
    title: 'JavaScript Book',  
    author: 'Michael Smith',  
  },  
];

const typeDefs = gql`  
  type Book {  
    title: String  
    author: String  
  } type Query {  
    books: [Book]  
  }  
`;

const resolvers = {  
  Query: {  
    books: () => books,  
  },  
};

const app = express();  
const server = new ApolloServer({ typeDefs, resolvers });  
server.applyMiddleware({ app });
app.listen(3000, () => console.log('server started'));
Enter fullscreen mode Exit fullscreen mode

In the code above, we created our basic Apollo GraphQL server by creating our data in the books array.

Then we used the gql tag with our schema definition string passed in to create our schema and assigned it to the typedefs constant.

The query type is always required so we can query data from our server. The server won’t run without it.

We created a Book type with fields title and author . Then we created a books query to return an array of Books.

Next, we created our resolvers so that we can query the data we created. We just created a books resolve to return the books array.

Finally, we have the following initialization code to load the server:

const app = express();  
const server = new ApolloServer({ typeDefs, resolvers });  
server.applyMiddleware({ app });app.listen(3000, () => console.log('server started'));
Enter fullscreen mode Exit fullscreen mode

Then when we go to /graphql in our browser, we see a UI to test our query.

To run the server, we run:

node index.js
Enter fullscreen mode Exit fullscreen mode

We can test our server by running:

{  
  books {  
    title  
    author  
  }  
}
Enter fullscreen mode Exit fullscreen mode

Then when we click the arrow button in the middle, we should get:

{  
  "data": {  
    "books": [  
      {  
        "title": "JavaScript for Dummies",  
        "author": "Jane Smith"  
      },  
      {  
        "title": "JavaScript Book",  
        "author": "Michael Smith"  
      }  
    ]  
  }  
}
Enter fullscreen mode Exit fullscreen mode

as the response.

Conclusion

We created a simple Apollo GraphQL server with Express by installing the express and express-apollo-server packages.

Then we created the type definition by passing a string with the type definitions into the gql tag.

Once we did that, we created a resolver to return the response which is mapped from the query.

Then we run the server to make the query and return the data. We can test that by going to the /graphql page that comes with the Express Apollo server.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .