This commit is contained in:
58
node_modules/apollo-link-context/README.md
generated
vendored
Normal file
58
node_modules/apollo-link-context/README.md
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: apollo-link-context
|
||||
description: Easily set a context on your operation, which is used by other links further down the chain.
|
||||
---
|
||||
|
||||
The `setContext` function takes a function that returns either an object or a promise that returns an object to set the new context of a request.
|
||||
|
||||
It receives two arguments: the GraphQL request being executed, and the previous context. This link makes it easy to perform async look up of things like authentication tokens and more!
|
||||
|
||||
```js
|
||||
import { setContext } from "apollo-link-context";
|
||||
|
||||
const setAuthorizationLink = setContext((request, previousContext) => ({
|
||||
headers: {authorization: "1234"}
|
||||
}));
|
||||
|
||||
const asyncAuthLink = setContext(
|
||||
request =>
|
||||
new Promise((success, fail) => {
|
||||
// do some async lookup here
|
||||
setTimeout(() => {
|
||||
success({ token: "async found token" });
|
||||
}, 10);
|
||||
})
|
||||
);
|
||||
```
|
||||
|
||||
## Caching lookups
|
||||
|
||||
Typically async actions can be expensive and may not need to be called for every request, especially when a lot of request are happening at once. You can setup your own caching and invalidation outside of the link to make it faster but still flexible!
|
||||
|
||||
Take for example a user auth token being found, cached, then removed on a 401 response:
|
||||
|
||||
```js
|
||||
import { setContext } from "apollo-link-context";
|
||||
import { onError } from "apollo-link-error";
|
||||
|
||||
// cached storage for the user token
|
||||
let token;
|
||||
const withToken = setContext(() => {
|
||||
// if you have a cached value, return it immediately
|
||||
if (token) return { token };
|
||||
|
||||
return AsyncTokenLookup().then(userToken => {
|
||||
token = userToken;
|
||||
return { token };
|
||||
});
|
||||
});
|
||||
|
||||
const resetToken = onError(({ networkError }) => {
|
||||
if (networkError && networkError.name ==='ServerError' && networkError.statusCode === 401) {
|
||||
// remove cached token on 401 from the server
|
||||
token = null;
|
||||
}
|
||||
});
|
||||
|
||||
const authFlowLink = withToken.concat(resetToken);
|
||||
```
|
||||
Reference in New Issue
Block a user