const express = require('express') const { graphqlHTTP } = require("express-graphql"); const { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLList, GraphQLInt, GraphQLNonNull } = require('graphql') const app = express() const port = 3000 // Sample Data const authors = [ { id: 1, name: 'Dan Brown' }, { id: 2, name: 'J. R. R. Tolkien' }, { id: 3, name: 'Brent Weeks' } ] const books = [ { id: 1, name: 'The Lost Symbol', authorId: 1 }, { id: 2, name: 'Angels and Demons', authorId: 1 }, { id: 3, name: 'The Davinci Code', authorId: 1 }, { id: 4, name: 'The Fellowship of the Ring', authorId: 2 }, { id: 5, name: 'The Two Towers', authorId: 2 }, { id: 6, name: 'The Return of the King', authorId: 2 }, { id: 7, name: 'The Way of Shadows', authorId: 3 }, { id: 8, name: 'Beyond the Shadows', authorId: 3 } ] const BookType = new GraphQLObjectType({ name: 'Book', description: 'This represents a book written by an author', fields: () => ({ id: { type: GraphQLNonNull(GraphQLInt) }, name: { type: GraphQLNonNull(GraphQLString) }, authorId: { type: GraphQLNonNull(GraphQLInt) }, author: { type: AuthorType, // AuthorType is defined below the same way that BookType is defined above resolve: (book) => { return authors.find(author => author.id === book.authorId) } } }) }) const AuthorType = new GraphQLObjectType({ name: 'Author', description: 'This represents the author of a book', fields: () => ({ id: { type: GraphQLNonNull(GraphQLInt) }, name: { type: GraphQLNonNull(GraphQLString) } }) }) const RootQueryType = new GraphQLObjectType({ name: 'Query', description: 'Root Query', fields: () => ({ books: { type: new GraphQLList(BookType), description: "List of books", resolve: () => books } }) }) const schema = new GraphQLSchema({ query: RootQueryType }) app.use('/graphql', graphqlHTTP({ schema: schema, graphiql: true })) app.get('/', (req, res) => { res.send(`<a href="http://localhost:${port}/graphql">GraphiQL</a>`) }) // QUERY: // // { // books { // id // name // author { // name // } // } // } // RESULT // // { // "data": { // "books": [ // { // "id": 1, // "name": "The Lost Symbol", // "author": { // "name": "Dan Brown" // } // }, // { // "id": 2, // "name": "Angels and Demons", // "author": { // "name": "Dan Brown" // } // }, //... // ] // } // } app.listen(port, () => { console.log(`App listening on http://localhost:${port}`) });