graphqlapollo-server

Is it possible to query my running apollo graphqlserver locally, without using http?


I'm running a Graphql server from Apollo, and the objective is fetch some data. However, I need this data locally - on the same server. Is that possible, or is the only way to query the Apollo server using http?

I know that I could possible accomplish this without using GraphQl, and just access the data layer, but the thing is that I would like to benefit from:

I already have a working solution where I just use node-fetch to query localhost, but it seems like quite a bit of overhead.


Solution

  • Yes it is possible!

    Apollo makes the schema building and execution for you, but you can also do it yourself. Here is a mini example based on the apollo-server-express package. I create the schema and then give it to the apollo-server. Look below the server startup, I also create a query-string, then parse it and execute it without apollo and without an http request.

    const express = require('express');
    const { ApolloServer, gql, makeExecutableSchema } = require('apollo-server-express');
    const { parse } = require('graphql/language')
    const { execute } = require('graphql')
    
    // Construct a schema, using GraphQL schema language
    const typeDefs = gql`
      type Query {
        hello: String
      }
    `;
    
    // Provide resolver functions for your schema fields
    const resolvers = {
      Query: {
        hello: () => 'Hello world!',
      },
    };
    
    const schema = makeExecutableSchema({
      typeDefs,
      resolvers,
    })
    
    async function startApolloServer() {
    
      const server = new ApolloServer({ schema });
      await server.start();
    
      const app = express();
      server.applyMiddleware({ app });
    
      await new Promise(resolve => app.listen({ port: 4000 }, resolve));
      console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
      return { server, app };
    }
    
    startApolloServer()
    
    const query = `
      query {
        hello
      }
    `
    
    const document = parse(query)
    
    const res = execute({
      schema,
      document,
    })
    
    console.log('res no request:', res)
    
    

    if you run it, install apollo-server-express and graphql with npm and you are good to go

    To execute you can pass all your request logic as well:

        execute({
          schema,
          document,
          rootValue: {},
          contextValue: {
            userInfo,
            dbClient,
          },
          variableValues: body.variables,
        }),
    

    It is highly useful also if you want to test you server. If you need to do subscriptions you can use the subscribe method imported from graphql as well.