Let's build a real server which can parse GraphQL queries sent over HTTP.
First, install babel (to use ES2015 awesomeness), restify and of course, graphql
npm i babel graphql restify
Create three files- index.js, server.js and schema.js.
touch index.js server.js schema.js
index.js file will be our entry point. We'll just register babel here so that the rest of our application can use ES2015 code.
//index.js
require('babel/register');
require('./server');Let's build our schema now. We'll use dummy data here for the sake of brevity, but as you'll see using something like Bookshelf.js/Knexjs/Sequelize will be trivial. We'll pass the ID parameter with our query like {contributor (id: "1")} to get the GraphQL contributor's github username.
Here's the code in schema.js:
//schema.js
import {
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLString
} from 'graphql';
let dummyData = {
'1': 'leebyron',
'2': 'enaqx',
'3': 'schrockn',
'4': 'andimarek'
};
export default new GraphQLSchema({
query: new GraphQLObjectType({
name: 'RootQueryType',
fields: {
contributor: {
type: GraphQLString,
args: {
id: { type: GraphQLString }
},
//Using Destructuring of ES2015 to assign value to id
resolve: (root, {id}) => {
return dummyData[id];
}
}
}
})
});You are probably already familiar with koa/express/restify. This part is easiest for you in that case:
//server.js
import restify from 'restify';
import { graphql } from 'graphql';
import schema from './schema.js';
var server = restify.createServer({
name: 'GraphQL Demo'
});
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.post('/', (req, res, next) => {
graphql(schema, req.body).then((result) => {
res.send(result);
});
});
server.get('/', (req, res, next) => {
let instruction = 'POST GraphQL queries to' + server.url + '. Sample query: {contributor (id: "1")}';
res.send(instruction);
});
server.listen(process.env.PORT || 8080, () => {
console.log('%s listening at %s', server.name, server.url);
});In order to run the server:
node index.js
The server will start at http://localhost:8080 address.
Now we can use Postman or just simple CURL to test if it is working:
curl -XPOST -d '{contributor (id: "1")}' http://localhost:8080/
If you got {"data":{"contributor":"leebyron"}} in return, congratulations for making it this far!
Previous - On the Server-Side - Creating Your First Schema
Next - Deep Dive into GraphQL Type System