Apollo-link: ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์žก๊ธฐ

์— ๋งŒ๋“  2017๋…„ 11์›” 02์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link

๋ฌธ์„œ์—์„œ ์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด fetch๋ฅผ 2๋ฒˆ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ๋Š” ๊ตฌ๋…์—์„œ, ๋‘ ๋ฒˆ์งธ๋Š” http ๋งํฌ์—์„œ):

http://apollo-link-docs.netlify.com/docs/link/stateless.html

const reportErrors = (errorCallback) => new ApolloLink((operation, forward) => {
  const observer = forward(operation);
  // errors will be sent to the errorCallback
  observer.subscribe({ error: errorCallback })
  return observer;
});

//...

const createLinks = () =>
  ApolloLink.from([
    reportErrors(console.error),
    httpLink,
  ]);

๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์‚ฌ์–‘์— ๋”ฐ๋ผ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์‚ฐ์ž fn์€ ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋… ํ˜ธ์ถœ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ httpLink ์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ํŒŒ๊ณ  map , reduce ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ๋ˆ„๊ตฌ๋„ ์˜ค๋ฅ˜ ์ฝœ๋ฐฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@valerybugakov ๋Š” apollo-error-link๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด httpLink๋กœ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

๋ชจ๋“  5 ๋Œ“๊ธ€

@valerybugakov ๋Š” apollo-error-link๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด httpLink๋กœ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { createHttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { InMemoryCache } from 'apollo-cache-inmemory';

const errorLink = onError(({ networkError, graphQLErrors }) => {
  if (graphQLErrors) {
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
      ),
    );
  }
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const httpLink = createHttpLink({ ... });

const link = ApolloLink.from([
  ...otherLinksIfNeeded,
  errorLink,
  httpLink,
]);

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  queryDeduplication: true,
});

@somehandle ๋„ค, ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ๋งํฌ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? next(operation) ๋ฐ˜ํ™˜๋œ Observable์„ ๋‹ค๋ฅธ Observable๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

@valerybugakov ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ Graphql ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .map ์˜ ๊ฒฐ๊ณผ์— forward(operation) ๊ฐ€ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹น์‹ ์€ ๋‹ค๋ฅธ ๊ด€์ฐฐ์ž ์ฃผ์œ„์— ๊ฐ€์ž… ํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒฝ์šฐ. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด apollo-link-error ๋’ค์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค!

@jbaxleyiii
๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ์žก์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
400, ์ž˜๋ชป๋œ ์š”์ฒญ์„ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰