
* Add correct project references for `apollo-server-cloud-functions`. The `apollo-server-cloud-functions` has been been mis-referenced (or referenced inconsistently) since its original inception in #1446 when its package directory was `apollo-server-cloud-function` (singular!) and the `package.json` referenced the plural form (`apollo-server-cloud-functions`): https://github.com/apollographql/apollo-server/commit/724d9ff0#diff-e1d725fd66f7e9ef5251abf0437a09ca These references have been mostly fixed in the READMEs and supporting documentation, but the underlying monorepo directory structure has still not been fixed, which I'm sure contributed to this module being overlooked and unreferenced in the move to TypeScript project references in #1772. Additionally, the lack of referencing in the monorepo's TS config has resulted in it being broken in the most recent 2.2.0 release, as reported by @pyros2097 and @thetre97 in: https://github.com/apollographql/apollo-server/pull/1896#issuecomment-436994955 This should fix that by properly adding the TypeScript project references. * Sorting.
5.5 KiB
title | description |
---|---|
Google Cloud Functions | Setting up Apollo Server with Google Cloud Functions |
This is the Google Cloud Function integration of GraphQL Server. Apollo Server is a community-maintained open-source GraphQL server that works with many Node.js HTTP server frameworks. Read the docs. Read the CHANGELOG.
npm install apollo-server-cloud-functions graphql
Deploying with Google Cloud Function
1. Write the API handlers
First, create a package.json
file and include apollo-server-cloud-functions
in your dependencies. Then in a file named index.js
, place the following code:
const { ApolloServer, gql } = require('apollo-server-cloud-functions');
// 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,
playground: true,
introspection: true,
});
exports.handler = server.createHandler();
2. Configure your Cloud Function and deploy
On the Create Function page, set Trigger to HTTP
and Function to execute to the name of your exported handler, in this case handler
.
Since NODE_ENV is a reserved environment variable in GCF and it defaults to "production", both the playground and introspection
options need to be explicitly set to true
for the GraphQL Playground to work correctly.
After configuring your Function you can press Create and an http endpoint will be created a few seconds later.
You can refer to the Cloud Functions documentation for more details
Getting request info
To read information about the currently executing Google Cloud Function (HTTP headers, HTTP method, body, path, ...) use the context option. This way you can pass any request specific data to your schema resolvers.
const { ApolloServer, gql } = require('apollo-server-cloud-functions');
// 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,
context: ({ req, res }) => ({
headers: req.headers,
req,
res,
}),
});
exports.handler = server.createHandler();
Modifying the GCF Response (Enable CORS)
To enable CORS the response HTTP headers need to be modified. To accomplish this use the cors
option.
const { ApolloServer, gql } = require('apollo-server-cloud-functions');
// 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.handler = server.createHandler({
cors: {
origin: '*',
credentials: true,
},
});
To enable CORS response for requests with credentials (cookies, http authentication) the allow origin header must equal the request origin and the allow credential header must be set to true.
const { ApolloServer, gql } = require('apollo-server-cloud-functions');
// 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.handler = server.createHandler({
cors: {
origin: true,
credentials: true,
},
});
Cors Options
The options correspond to the express cors configuration with the following fields(all are optional):
origin
: boolean | string | string[]methods
: string | string[]allowedHeaders
: string | string[]exposedHeaders
: string | string[]credentials
: booleanmaxAge
: number
Principles
GraphQL Server is built with the following principles in mind:
- By the community, for the community: GraphQL Server's development is driven by the needs of developers
- Simplicity: by keeping things simple, GraphQL Server is easier to use, easier to contribute to, and more secure
- Performance: GraphQL Server is well-tested and production-ready - no modifications needed
Anyone is welcome to contribute to GraphQL Server, just read CONTRIBUTING.md, take a look at the roadmap and make your first PR!