Create Apollo DataSource to connect to a GraphQL API

Usage no npm install needed!

<script type="module">
  import apolloDatasourceGraphql from 'https://cdn.skypack.dev/apollo-datasource-graphql';



Connect your GraphQL server to an existing GraphQL API using DataSources.

Note: This is designed to work with Apollo Server 2.0 and Data Sources

GraphQL Data Source


yarn add apollo-datasource-graphql


npm i apollo-datasource-graphql --save


Define a data source by extending the GraphQLDataSource class. You can then implement the queries and mutations that your resolvers require.

import { GraphQLDataSource } from 'apollo-datasource-graphql';
import { gql } from 'apollo-server-express';

const CRAFT_BEERS = gql`
  query {
    craftBeers {
      brewery {

export class CraftBeerGraphQLAPI extends GraphQLDataSource {
  baseURL = 'https//craft-beer-api.example/graphql';

  async getCraftBeers() {
    try {
      const response = await this.query(CRAFT_BEERS);

      return response.data.craftBeers;
    } catch (error) {

GraphQL Operations

The query and mutation methods on the GraphQLDataSource make a request to the GraphQL server. Both accepts a second parameter, options, which can be used to pass variables, context, etc.

async searchCraftBeerByName(name) {
  try {
    const response = await this.query(CRAFT_BEERS, {
      variables: {

    return response.data.craftBeer;
  } catch (error) {
Parameter Description Required
graphQLDocument A GraphQL document true
options An object that defines options to pass with the GraphQL request false
Options Description Required
variables A GraphQL document false
operationName A string name of the query if it is named, otherwise it is null false
context Metadata to be passed between Apollo Links false
extensions A map to store extensions data to be sent to the server false

Intercepting Operations

You can intercept the request to set headers on an outgoing request. Since Apollo Data Sources have access to GraphQL context, you can store a user token or other information you need to have available when making a request.

Add the method willSendRequest to your class which will receive the request object. Here, you can modify the request to meet your needs.

  willSendRequest(request) {
    const { accessToken } = this.context;

    if (!request.headers) {
      request.headers = {};
    request.headers.authorization = accessToken;


  • Complete README
  • Mutation method
  • Test Suite
  • Request caching