https://github.com/poetic/apollo-datasource-graphql
GraphQL/Apollo DataSource to connect to GraphQL API's from your Apollo Server
https://github.com/poetic/apollo-datasource-graphql
Last synced: 5 months ago
JSON representation
GraphQL/Apollo DataSource to connect to GraphQL API's from your Apollo Server
- Host: GitHub
- URL: https://github.com/poetic/apollo-datasource-graphql
- Owner: poetic
- Created: 2018-07-18T14:37:48.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2021-08-10T23:44:42.000Z (almost 4 years ago)
- Last Synced: 2024-12-08T09:31:21.237Z (6 months ago)
- Language: TypeScript
- Homepage:
- Size: 42 KB
- Stars: 84
- Watchers: 10
- Forks: 18
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 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](https://www.apollographql.com/docs/apollo-server/whats-new.html) and [Data Sources](https://www.apollographql.com/docs/apollo-server/features/data-sources.html)**
## GraphQL Data Source
### Install
```
yarn add apollo-datasource-graphql
```or
```
npm i apollo-datasource-graphql --save
```### Usage
Define a data source by extending the `GraphQLDataSource` class. You can then implement the queries and mutations that your resolvers require.
```javascript
import { GraphQLDataSource } from 'apollo-datasource-graphql';
import { gql } from 'apollo-server-express';const CRAFT_BEERS = gql`
query {
craftBeers {
name
style
abv
brewery {
name
}
}
}
`;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) {
console.error(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.
```javascript
async searchCraftBeerByName(name) {
try {
const response = await this.query(CRAFT_BEERS, {
variables: {
name,
},
});return response.data.craftBeer;
} catch (error) {
console.error(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.
```javascript
willSendRequest(request) {
const { accessToken } = this.context;if (!request.headers) {
request.headers = {};
}
request.headers.authorization = accessToken;
}
```## TODO
- [x] Complete README
- [x] Mutation method
- [ ] Test Suite
- [ ] Request caching