amsjs-workshop

Stars
8

Building a GraphQL Server with Node.JS

This is the repository for the morning workshop at AmsterdamJS

See the end of this README to get a 25% discount on your GraphQL Europe ticket

Overview

This git repository contains several branches that correspond to the "steps" to be performed throughout the workshops. The master branch contains the final version of the code.

  • Step 0: Minimal GraphQL server
  • Step 1: Extend API with query arguments
  • Step 2: Complete API operations
  • Step 3: Add database layer with Prisma and Prisma bindings
  • Step 4: Complete API operations against the database

Usage

Clone the repository

git clone [email protected]:nikolasburk/amsjs-workshop.git
cd amsjs-workshop

Deploy the Prisma service

npm install -g prisma
prisma deploy

Note: When running prisma deploy, the Prisma CLI prompts you to select a Prisma server to which the Prisma service should be deployed. Select the Demo server to deploy to Prisma Cloud or setup your own Prisma server locally with Docker. The endpoint that's then printed by the CLI needs to be pasted into index.js where Prisma is instantied.

Start the server

node src/index.js

Open a GraphQL Playground

npm install -g graphql-cli
graphql playground

The Playground now allows to work with both GraphQL APIs side-by-side. It receives its information about the corresponding endpoints and schemas from the configuration in .graphqlconfig.yml:

  • app: The application layer built with graphql-yoga
  • prisma The database layer configured with Prisma

Sample queries/mutations

In the following queries/mutation, __POST_ID__ is a placeholder that needs to be replaced with the id of an actual Post item in your database.

Application layer (graphql-yoga)

post(id: "__POST_ID__") {
  id
  title
  content
  published
}
mutation {
  createDraft(
    title: "How to GraphQL"
    content: "Learn best practices all around developing GraphQL APIs"
  ) {
    id
    published
  }
}
mutation {
  publish(id: "__POST_ID__") {
    id
    published
  }
}
mutation {
  deletePost(id: "__POST_ID__") {
    id
    title
    content
    published
  }
}

Database layer (Prisma)

query {
  posts(where: {
    title_contains: "QL"
  }) {
    id
    title
    content
    published
  }
}
query {
  post(where: {
    id: "__POST_ID__"
  }) {
    id
    title
    content
    published
  }
}
mutation {
  updatePost(
    where: {
      id: "__POST_ID__"
    }
    data: {
      published: true
    }
  ) {
    id
    title
    content
    published
  }
}
mutation {
  deletePost(where: {
    id: "__POST_ID__"
  }) {
    id
    title
    content
    published
  }
}

Technology stack

The GraphQL server in this repository is build upon the following technologies:

  • graphql-yoga: A GraphQL server library based on Express.js. It features out-of-the-box support for GraphQL Playgrounds as well as realtime GraphQL subscriptions.
  • Prisma: A GraphQL database proxy that makes it easy to connect your GraphQL server to a database and massively simplifies your resolver implementations.
  • Docker (optional): In case you have Docker installed, you can deploy your Prisma APIs locally. Otherwise you can use a free sandbox environment provided by Prisma Cloud.

Note: When using Docker to deploy Prisma locally, the Prisma API is backed by a local MySQL database. If you're using Prisma Cloud, your Prisma API is running against an instance of AWS Aurora.

Recommended resources

GraphQL Europe

Get your tickets for GraphQL Europe here. As a special for workshop attendees, you can use this promo code to get a 25% discount on your ticket: amsmjs