nodejs graphql server CRUD example
1. Add the following packages.
npm install apollo-server --save npm install graphql --save
2. Create some sample data, dummybooks.js
const books = [ { title: 'Harry Potter and the Chamber of Secrets', author: 'J.K. Rowling', }, { title: 'Jurassic Park', author: 'Michael Crichton', }, ]; for (let i=0; i<1000; i++) { books.push({ title: `Title: ${i}`, author: `Author: ${i}`, }); } module.exports = books
3. Define schema for the graphql server in typeDefs.js, this will be the types of objects served by the graphql server.
const { gql } = require('apollo-server'); // A schema is a collection of type definitions (hence "typeDefs") // that together define the "shape" of queries that are executed against // your data. const typeDefs = gql` # Comments in GraphQL strings (such as this one) start with the hash (#) symbol. # This "Book" type defines the queryable fields for every book in our data source. type Book { title: String author: String } # The "Query" type is special: it lists all of the available queries that # clients can execute, along with the return type for each. In this # case, the "books" query returns an array of zero or more Books (defined above). type Query { books: [Book] info: String! feed: [Link!]! link(id: ID!): Link } type Mutation { # Create a link post(url: String!, description: String!): Link! # Update a link updateLink(id: ID!, url: String, description: String): Link # Delete a link deleteLink(id: ID!): String } type Link { id: ID! description: String! url: String! } type Subscription { newLink: Link } `; module.exports = typeDefs;
4. Create resolvers for the graphql server resolvers.js, this will be the code that handles the requests coming to the graphql server.
const { PubSub } = require('apollo-server'); const books = require('./dummybooks.js'); const pubsub = new PubSub(); const LINK_ADDED = 'LINK_ADDED'; let links = [{ id: 'link-0', url: 'www.howtographql.com', description: 'Fullstack tutorial for GraphQL' }]; let idCount = links.length; function link(parent, args) { console.log("debug Query link received with args: ", args); return links.find((link=>link.id === args.id)); } const Query = { info: () => `This is the API of a Hackernews Clone`, books: () => books, feed: () => links, link, }; const Mutation = { post: (parent, args) => { console.log("\n\n\ndebug Mutation post received with args: ", args); const link = { id: `link-${idCount++}`, description: args.description, url: args.url, }; links.push(link); pubsub.publish(LINK_ADDED, { newLink: link }); return link; }, updateLink: (parent, args) => { console.log("\n\n\ndebug Mutation updateLink received with args: ", args); const updatedLink = { id: args.id, description: args.description, url: args.url, }; const linkIndex = links.findIndex((link => link.id === updatedLink.id)); if (linkIndex < 0) { throw new Error(`id ${updatedLink.id} not found.`); } const currentLink = links[linkIndex]; links[linkIndex] = { ...updatedLink } return links[linkIndex]; }, deleteLink: (parent, args) => { console.log("\n\n\ndebug Mutation deleteLink received with args: ", args); console.log("debug Mutation deleteLink link size before: ", links.length); const linkIndex = links.findIndex((link => link.id === args.id)); if (linkIndex < 0) { throw new Error(`id ${args.id} not found.`); } links.splice(linkIndex, 1); console.log("debug Mutation deleteLink link size after : ", links.length); return 'deleted.'; } }; const Subscription = { newLink: { // Additional event labels can be passed to asyncIterator creation subscribe: () => pubsub.asyncIterator([LINK_ADDED]), }, }; // resolvers module.exports = { Query, Mutation, Subscription, };
5. Put the server together in index.js, an apollo server and takes the typeDefs and resolvers for the graphql services.
const { ApolloServer } = require('apollo-server'); const typeDefs = require('./typeDefs.js'); const resolvers = require('./resolvers.js'); // The ApolloServer constructor requires two parameters: your schema // definition and your set of resolvers. const server = new ApolloServer({ typeDefs, resolvers }); // The `listen` method launches a web server. server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
Search within Codexpedia
Custom Search
Search the entire web
Custom Search
Related Posts