Below is the now deleted section from the apollo-server README comparing apollo-server to express-graphql.
Note that some of these arguments do not apply anymore e.g. express-grapqhl is now written in TypeScript. Hence the removal of this section from the README.
One observation is that apollo-server is too bloated, and is slowly showing a lack of maintenance. I would go with express-graphql instead if I were to pick one today. But this is personal preference and you should do your own due diligence.
There's also a community-maintained Koa port of express-graphql, called koa-graphql. Using either express-graphql, or koa-graphql, combined with something like envelop, you can achieve everything, if not more, the Apollo "ecosystem" provides in a more modular manner.
Comparison with express-graphql
Both Apollo Server and
express-graphql
are
GraphQL servers for Node.js, built on top of the graphql-js
reference implementation, but
there are a few key differences:
express-graphql
works with Express and Connect, Apollo Server supports Express, Connect, Hapi, Koa and Restify.
- Compared to
express-graphql
, Apollo Server has a simpler interface and supports exactly one way of passing queries.
- Apollo Server separates serving GraphiQL (an in-browser IDE for
exploring GraphQL) from responding to GraphQL requests.
express-graphql
contains code for parsing HTTP request bodies, Apollo Server leaves that to standard packages like body-parser.
- Apollo Server includes an
OperationStore
to easily manage whitelisting.
- Apollo Server is built with TypeScript.
application/graphql requests
express-graphql
supports the application/graphql
Content-Type for
requests, which is an alternative to application/json
request with
only the query part sent as text. In the same way that we use
bodyParser.json
to parse application/json
requests for
apollo-server, we can use bodyParser.text
plus one extra step in
order to also parse application/graphql
requests. Here's an example
for Express:
'body-parser'; import { graphqlExpress } from 'apollo-server-express';
const myGraphQLSchema = // ... define or import your schema here!
const helperMiddleware = [
bodyParser.json(),
bodyParser.text({ type: 'application/graphql' }),
(req, res, next) => {
if (req.is('application/graphql')) {
req.body = { query: req.body };
}
next();
} ];
express()
.use('/graphql', ...helperMiddleware, graphqlExpress({ schema: myGraphQLSchema }))
.listen(3000); ```