No description
Find a file
Jesse Rosenberger 8b02c0c440
Allow Node.js-like runtimes to identify as Node.js as well. (#2357)
Previously, in order to only load dependencies which only work on Node.js
and fail in non-Node.js environments, we introduced a check which did a
string-comparison of `process.release.name` to see if it is was `node`.

This was first introduced in 9c563fae50 as
part of #2054, but has gone on to be useful for other purposes as well.

Some Node.js forks such as NodeSource's N|Solid, which is a fork of Node.js
which follows-up each Node.js release with a custom build that includes
additional native addons but is otherwise the same, override this value with
their own name.  This means that N|Source returns `nsolid`, despite the fact
that it is almost entirely the same as Node.js.

Luckily, N|Solid leaves the base version of its Node.js in
`process.versions.node` (and additionally adds its own
`process.versions.nsolid`).  By relaxing the string comparison on
`process.release.name`, we should still be able to accurately detect the
environment we want - which is "Close enough to Node.js!".

Fixes https://github.com/apollographql/apollo-server/issues/2356
2019-02-22 09:04:16 +02:00
.circleci Add support for Jest JUnit test output for consumption by CircleCI. 2018-09-26 22:47:58 +03:00
.github Set GH CODEOWNERS and update the README (#2034) 2018-11-28 15:18:48 +02:00
.vscode Add TypeScript watch as default build task 2018-10-12 11:23:30 +02:00
__mocks__ Fix apollo-server-env mock 2018-10-11 14:43:29 +02:00
docs docs: Remove suggestion that server is required for applyMiddleware. 2019-02-20 20:41:04 +02:00
packages Allow Node.js-like runtimes to identify as Node.js as well. (#2357) 2019-02-22 09:04:16 +02:00
types Switch json-stable-stringify to fast-json-stable-stringify. (#2065) 2018-12-19 20:06:17 +02:00
.gitignore remove .DS_Store (#2055) 2018-11-30 18:43:01 +02:00
.prettierignore Move prettier file globs into .prettierrc.js file. 2018-09-26 14:32:09 +03:00
.prettierrc.js Move prettier file globs into .prettierrc.js file. 2018-09-26 14:32:09 +03:00
CHANGELOG.md Update CHANGELOG.md in preparation for v2.4.5. 2019-02-21 14:32:55 -05:00
codecov.yml Allow 0.5% drop in codecov since it sometimes drops by tenths of percents. 2018-10-30 17:04:36 +02:00
CONTRIBUTING.md Tick off Prettier checkmarks, which were present on CI but not locally. (#880) 2018-03-16 10:25:07 +02:00
DESIGN.md Tick off Prettier checkmarks, which were present on CI but not locally. (#880) 2018-03-16 10:25:07 +02:00
jest.config.base.js Migrate apollo-graphql package to apollo-tooling repo (#2316) 2019-02-14 12:41:58 +02:00
lerna.json Clean up lerna.json 2018-08-31 11:01:32 +02:00
LICENSE cherry-pick changes from master 2016-07-05 15:01:49 -07:00
netlify.toml Introduce a netlify.toml configuration to fix docs generation on Netlify. 2018-08-28 12:05:12 +03:00
package-lock.json Pin @types/node to v8.x range. 2019-02-20 15:09:10 +02:00
package.json Pin @types/node to v8.x range. 2019-02-20 15:09:10 +02:00
README.md Replace Slack shields in project README.mds with Spectrum shields. (#2345) 2019-02-20 17:55:16 +02:00
renovate.json Keep @types/node types at v8. (#2344) 2019-02-20 15:02:49 +02:00
ROADMAP.md Setup prettier (#724) 2018-01-08 15:08:01 -08:00
tsconfig.base.json Enable forceConsistentCasingInFileNames in tsconfig.base.json 2018-10-11 23:10:44 +02:00
tsconfig.build.json Merge branch 'master' into re-stage-pr-1971 2019-02-14 15:01:00 +02:00
tsconfig.json Remove test dependencies from non-test tsconfig.json files 2018-10-11 12:58:03 +02:00
tsconfig.test.base.json Expose global fetch and URL types to avoid relying on dom lib 2018-10-11 23:10:45 +02:00
tsconfig.test.json Merge branch 'master' into re-stage-pr-1971 2019-02-14 15:01:00 +02:00

GraphQL Server for Express, Connect, Hapi, Cloudflare workers, and more

npm version Build Status Join the community on Spectrum

Apollo Server is a community-maintained open-source GraphQL server. It works with pretty much all Node.js HTTP server frameworks, and we're happy to take PRs for more! Apollo Server works with any GraphQL schema built with GraphQL.js, so you can build your schema with that directly or with a convenience library such as graphql-tools.

Documentation

Read the docs!

Principles

Apollo Server is built with the following principles in mind:

  • By the community, for the community: Apollo Server's development is driven by the needs of developers
  • Simplicity: by keeping things simple, Apollo Server is easier to use, easier to contribute to, and more secure
  • Performance: Apollo Server is well-tested and production-ready - no modifications needed

Anyone is welcome to contribute to Apollo Server, just read CONTRIBUTING.md, take a look at the roadmap and make your first PR!

Getting started

Apollo Server is super easy to set up. Just npm install apollo-server-<integration>, write a GraphQL schema, and then use one of the following snippets to get started. For more info, read the Apollo Server docs.

Installation

Run npm install --save apollo-server-<integration> and you're good to go!

const { ApolloServer, gql } = require('apollo-server');

// The GraphQL schema
const typeDefs = gql`
  type Query {
    "A simple type for getting started!"
    hello: String
  }
`;

// A map of functions which return data for the schema.
const resolvers = {
  Query: {
    hello: () => 'world',
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

While we recommend the use schema-definition language (SDL) for defining a GraphQL schema since we feel it's more human-readable and language-agnostic, Apollo Server can be configured with a GraphQLSchema object:

const { ApolloServer, gql } = require('apollo-server');
const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql');

// The GraphQL schema
const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: {
      hello: {
        type: GraphQLString,
        description: 'A simple type for getting started!',
        resolve: () => 'world',
      },
    },
  }),
});

const server = new ApolloServer({ schema });

server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});

Integrations

Often times, Apollo Server needs to be run with a particular integration. To start, run npm install --save apollo-server-<integration> where apollo-server-<integration> is one of the following:

  • apollo-server-express
  • apollo-server-koa
  • apollo-server-hapi
  • apollo-server-fastify
  • apollo-server-lambda
  • apollo-server-azure-functions
  • apollo-server-cloud-functions
  • apollo-server-cloudflare

Express

const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');

// 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 server = new ApolloServer({ typeDefs, resolvers });

const app = express();
server.applyMiddleware({ app });

const port = 4000;

app.listen({ port }, () =>
  console.log(`🚀 Server ready at http://localhost:${port}${server.graphqlPath}`),
);

Connect

const connect = require('connect');
const { ApolloServer, gql } = require('apollo-server-express');
const query = require('qs-middleware');

// 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 server = new ApolloServer({ typeDefs, resolvers });

const app = connect();
const path = '/graphql';

app.use(query());
server.applyMiddleware({ app, path });

const port = 4000;

app.listen({ port }, () =>
  console.log(`🚀 Server ready at http://localhost:${port}${server.graphqlPath}`),
);

Note; qs-middleware is only required if running outside of Meteor

Koa

const Koa = require('koa');
const { ApolloServer, gql } = require('apollo-server-koa');

// 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 server = new ApolloServer({ typeDefs, resolvers });

const app = new Koa();
server.applyMiddleware({ app });

const port = 3000;
const host = 'localhost';

app.listen(port, host, () =>
  console.log(`🚀 Server ready at http://${host}:${port}${server.graphqlPath}`),
);

Hapi

The code below requires Hapi 17 or higher.

const { ApolloServer, gql } = require('apollo-server-hapi');
const Hapi = require('hapi');

async function StartServer() {
  const server = new ApolloServer({ typeDefs, resolvers });

  const app = new Hapi.server({
    port: 4000,
  });

  await server.applyMiddleware({
    app,
  });

  await server.installSubscriptionHandlers(app.listener);

  await app.start();
}

StartServer().catch(error => console.log(error));

Context

The context is created for each request. The following code snippet shows the creation of a context. The arguments are the request, the request, and h, the response toolkit.

new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ request, h }) => {
    return { ... };
  },
})

Fastify

const { ApolloServer, gql } = require('apollo-server-fastify');
const { typeDefs, resolvers } = require('./module');

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

const app = require('fastify')();

(async function () {
  app.register(server.createHandler());
  await app.listen(3000);
})();

AWS Lambda

Apollo Server can be run on Lambda and deployed with AWS Serverless Application Model (SAM). It requires an API Gateway with Lambda Proxy Integration.

const { ApolloServer, gql } = require('apollo-server-lambda');

// 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 server = new ApolloServer({ typeDefs, resolvers });

exports.graphqlHandler = server.createHandler();

Apollo Server Development

If you want to develop Apollo Server locally you must follow the following instructions:

  • Fork this repository

  • Install the Apollo Server project in your computer

git clone https://github.com/[your-user]/apollo-server
cd apollo-server
npm install
cd packages/apollo-server-<integration>/
npm link
  • Install your local Apollo Server in other App
cd ~/myApp
npm link apollo-server-<integration>

Maintainers