Search code examples
graphqlapolloapollo-clientprismaprisma-graphql

How to send a GraphQL Query from Node.js to Prisma


I just learnt how to create a GraphlQL server using graphql-yoga and prisma-binding based on the HowToGraphQL tutorial.

Question: The only way to query the database so far was to use the Prisma Playground webpage that was started by running the command graphql playground.

Is it possible to perform the same query from a Node.js script? I came across the Apollo client but it seems to be meant for use from a frontend layer like React, Vue, Angular.


Solution

  • This is absolutely possible, in the end the Prisma API is just plain HTTP where you put the query into the body of a POST request.

    You therefore can use fetch or prisma-binding inside your Node script as well.

    Check out this tutorial to learn more: https://www.prisma.io/docs/tutorials/access-prisma-from-scripts/access-prisma-from-a-node-script-using-prisma-bindings-vbadiyyee9

    This might also be helpful as it explains how to use fetch to query the API: https://github.com/nikolasburk/gse/tree/master/3-Use-Prisma-GraphQL-API-from-Code

    This is what using fetch looks like:

    const fetch = require('node-fetch')
    
    const endpoint = '__YOUR_PRISMA_ENDPOINT__'
    
    const query = `
    query {
      users {
        id
        name
        posts {
          id
          title
        }
      }
    }
    `
    
    fetch(endpoint, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ query: query })
    })
      .then(response => response.json())
      .then(result => console.log(JSON.stringify(result)))
    

    If you want to use a lightweight wrapper around fetch that saves you from writing boilerplate, be sure to check out graphql-request.

    And here is how you use Prisma bindings:

    const { Prisma } = require('prisma-binding')
    
    const prisma = new Prisma({
      typeDefs: 'prisma.graphql',
      endpoint: '__YOUR_PRISMA_ENDPOINT__'
    })
    
    // send `users` query
    prisma.query.users({}, `{ id name }`)
      .then(users => console.log(users))
      .then(() =>
        // send `createUser` mutation
        prisma.mutation.createUser(
          {
            data: { name: `Sarah` },
          },
          `{ id name }`,
        ),
      )
      .then(newUser => {
        console.log(newUser)
        return newUser
      })
      .then(newUser =>
        // send `user` query
        prisma.query.user(
          {
            where: { id: newUser.id },
          },
          `{ name }`,
        ),
      )
      .then(user => console.log(user))