Apollo-link-rest: 404 였λ₯˜ 처리λ₯Όμœ„ν•œ ꢌμž₯ μ „λž΅?

에 λ§Œλ“  2018λ…„ 06μ›” 06일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: apollographql/apollo-link-rest


REST APIκ°€ 404 응닡을 μ‚¬μš©ν•˜μ—¬ λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚΄λŠ” 것은 맀우 μΌλ°˜μ μž…λ‹ˆλ‹€. λ°”λ‘œ μ§€κΈˆ 이런 일이 λ°œμƒν•˜λ©΄ κ²°κ³ΌλŠ” networkError 이며, μ΄λŠ” 기본적으둜 Apollo μŠ€νƒμ— μ˜ν•΄ GraphQL 였λ₯˜λ³΄λ‹€ 더 치λͺ…적인 였λ₯˜λ‘œ μ²˜λ¦¬λ˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같은 쿼리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

query BookQuery($slug: ID!) {
  book(slug: $slug) @rest(type: "Book", path: "book/:slug") {
    name
    author
  }
}

μ—”λ“œ ν¬μΈνŠΈκ°€ 404λ₯Ό λ°˜ν™˜ν•˜λ©΄ μ˜λ„κ°€ error render prop을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 치λͺ…적이지 μ•Šμ€ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œ ν•  κ°€λŠ₯μ„±μ΄μžˆλŠ” 경우 μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” λ„€νŠΈμ›Œν¬ 였λ₯˜μ™€ ν•¨κ»˜ κ±°λΆ€λ©λ‹ˆλ‹€. 즉, 이것이 REST λŒ€μ‹  GraphQL 쿼리 인 경우 λ„€νŠΈμ›Œν¬ 였λ₯˜λ‘œ λΆ„λ₯˜λ˜μ§€ μ•ŠμœΌλ©° μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 404 λ„€νŠΈμ›Œν¬ 였λ₯˜λ₯Ό GraphQL 였λ₯˜λ‘œ λ³€ν™˜ν•˜λŠ” λ‚΄ μ‚¬μš©μž 지정 error-link 검사λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

forward(operation).subscribe({
  next: result => {...},
  error: networkError => {
    if (networkError.statusCode === 404) {
      return observer.next({errors: [networkError]});
    }
    //...
    observer.error(networkError);
  },
  complete: observer.complete.bind(observer),
});

μ—¬μ „νžˆ κ°œμ„ μ˜ 여지가 μžˆμ§€λ§Œ 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 apollo-link-rest μ—μ„œ μ–΄λ–»κ²Œ λ“  ν•΄κ²°λ˜μ–΄μ•Όν•˜λŠ”μ§€ κΆκΈˆν•΄μ„œ λŒ€ν™”λ₯Ό μ‹œμž‘ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

enhancementπŸ’‘ question❔

λͺ¨λ“  12 λŒ“κΈ€

쒋은 μ§ˆλ¬Έμž…λ‹ˆλ‹€. -이 νŒ¨ν„΄μ΄ λ¬Έμ„œμ— λŒ€ν•œ μ œμ•ˆμœΌλ‘œ μΆ”κ°€λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. λ‚˜λŠ” μ—¬λŸ¬ μ•„ν΄λ‘œ 링크가 κ²ͺλŠ” 문제의 μ’…λ₯˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€ (μ•„ν΄λ‘œ 링크 μƒνƒœκ°€ λ–  μ˜€λ¦…λ‹ˆλ‹€).

κ·ΈλŸ¬λ‚˜ 이것이 ApolloLink의 λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ λ§žλŠ” 닡이라고 ν™•μ‹  ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆκΉŒ?

이것은 ν˜„μž¬ λͺ¨λ“  http 였λ₯˜κ°€ apollo-link-restμ—μ„œ μ²˜λ¦¬λ˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

        if (res.status >= 300) {
          // Throw a JSError, that will be available under the
          // "Network error" category in apollo-link-error
          let parsed: any;
          try {
            parsed = await res.json();
          } catch (error) {
            // its not json
            parsed = await res.text();
          }
          rethrowServerSideError(
            res,
            parsed,
            `Response not successful: Received status code ${res.status}`,
          );
        }
        return res;

μ‚¬μš©μžκ°€ 였λ₯˜ 처리 방법을 μ§€μ‹œ ν•  μˆ˜μžˆλŠ” λŒ€μ†Œ 문자 일치 κΈ°λŠ₯을 μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
404 == null 와 같은 일반적인 κ²½μš°μ— μœ μš©ν•œ κΈ°λ³Έ μœ ν‹Έλ¦¬ν‹°λ₯Ό 제곡 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬κ°€ μ†Œκ°œν•˜λŠ” μ†”λ£¨μ…˜μ΄μ΄ 링크의 λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ μ ν•©ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€λŠ” @fbartho 의 우렀λ₯Ό κ³΅μœ ν•˜λŠ” λ™μ•ˆ 404 였λ₯˜κ°€ 특히 ν•΄λ‘œμš΄ 경우λ₯Ό μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈμ—μ„œμ΄ 예λ₯Ό μ·¨ν•˜λ©΄ :

query postAndTags {
  post @rest(type: "Post", path: "/post/1") {
    id
    title
  }
  tags @rest(type: "[Tag]", path: "/tags") {
    name
  }
}

post κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  404λ₯Ό λ°˜ν™˜ν•˜λ©΄ 전체 쿼리가 λ„€νŠΈμ›Œν¬ 였λ₯˜λ‘œ μ‹€νŒ¨ν•©λ‹ˆλ‹€. μ–΄λ–€ κ²½μš°μ—λŠ” 이것이 λ°”λžŒμ§ ν•  수 μžˆμ§€λ§Œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μ•„μ•Όν•©λ‹ˆλ‹€.

const data = {
  post: null,
  tags: [{ name: 'apollo' }, { name: 'graphql' }],
}

이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ @paulpdanielsκ°€ μ œμ•ˆν•œλŒ€λ‘œ μΆ”κ°€ 였λ₯˜ 처리λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 맀우 μ‰½μŠ΅λ‹ˆλ‹€. 4xx 였λ₯˜λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ GraphQL 였λ₯˜ λ˜λŠ” κ²°κ³Όλ₯Ό null μ„€μ •ν•˜λŠ” λ“± 특수 μ²˜λ¦¬κ°€ ν•„μš”ν•œ 치λͺ…적이지 μ•Šμ€ 였λ₯˜ 일 κ°€λŠ₯μ„±μ΄μžˆλŠ” 404 및 400/412/422 (변이) 만 μ‹€μ œλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 였λ₯˜μ— λŒ€ν•΄ κ³ μ • 된 처리기λ₯Ό μ œκ³΅ν•˜λŠ” 것이 합리적인지 μ•„λ‹ˆλ©΄ error-link λ˜λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ— λ§‘κ²¨μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ 의문이 남아 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ λ³€ν˜• 쿼리가 μ§€μ›λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— (λ‚΄ 생각에?) 특히 κ΄€λ ¨μ„±μ΄μžˆλŠ” μœ μΌν•œ ν˜„μž¬ 짧은 것은 μœ„μ—μ„œ μ‹œμž‘ν•œ 404 μ˜ˆμ œμž…λ‹ˆλ‹€.

ꡬ성에 였λ₯˜ 처리기λ₯Ό μΆ”κ°€ν•˜λŠ” μ˜΅μ…˜λ„ μžˆμ§€λ§Œ μ‹€μ œλ‘œλŠ” 거기에 μ†ν•˜λŠ” error-link μ—μ„œ κΈ°λŠ₯을 ν›”μΉ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. λ˜ν•œμ΄ 링크의 APIλ₯Ό λΆˆν•„μš”ν•˜κ²Œ λ³΅μž‘ν•˜κ²Œ λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

@marnusw ν›Œλ₯­ν•œ μ‘λ‹΅μž…λ‹ˆλ‹€. 기본적으둜 κ·€ν•˜μ˜ 행동을 κ΅¬ν˜„ν•˜λŠ” μˆ˜μ •μ„ μ§€μ›ν•©λ‹ˆλ‹€!

142λŠ” 404 였λ₯˜ 처리λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. 이것이 이번 ν† λ‘ μ—μ„œ κ°€μž₯ μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ§Žμ€ REST API ν‘œμ€€μ„ 기반으둜 λͺ¨λ“  였λ₯˜ μ½”λ“œμ—λŠ” 항상 μ‚¬λžŒμ΄ 읽을 μˆ˜μžˆλŠ” λ©”μ‹œμ§€κ°€ ν¬ν•¨λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. # 142μ—μ„œμ™€ 같이 κ·Έ κ²°κ³Όλ₯Ό λ¬΄νš¨ν™”ν•˜λŠ” 것은 그와 μ •λ°˜λŒ€μž…λ‹ˆλ‹€.

쒋은 REST API κ΄€ν–‰κ³Ό μΌμΉ˜ν•˜λ„λ‘ 404λ₯Ό 정상적인 λ„€νŠΈμ›Œν¬ 였λ₯˜λ‘œ λ³΅μ›ν•˜λŠ” PR을 μ˜¬λ ΈμŠ΅λ‹ˆλ‹€. https://github.com/apollographql/apollo-link-rest/pull/283

@christrude REST API에 κ΄€ν•΄μ„œλŠ” λ™μ˜ν•˜μ§€ μ•Šμ§€λ§Œμ΄ 라이브러리의 λͺ©μ μ€ REST APIκ°€ GraphQL처럼 μž‘λ™ν•˜λ„λ‘ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ λˆ„λ½ 된 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ GraphQL μ ‘κ·Ό 방식이 null λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이라면이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” RESTful 404 κ·œμΉ™μ„ GraphQL null λ°˜ν™˜ κ°’ κ·œμΉ™μœΌλ‘œ λ³€ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

@christrude REST API에 κ΄€ν•΄μ„œλŠ” λ™μ˜ν•˜μ§€ μ•Šμ§€λ§Œμ΄ 라이브러리의 λͺ©μ μ€ REST APIκ°€ GraphQL처럼 μž‘λ™ν•˜λ„λ‘ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ λˆ„λ½ 된 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ GraphQL μ ‘κ·Ό 방식이 null λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이라면이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” RESTful 404 κ·œμΉ™μ„ GraphQL null λ°˜ν™˜ κ°’ κ·œμΉ™μœΌλ‘œ λ³€ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ GraphQL은 UIμ—μ„œ 404 응닡을 μ–΄λ–»κ²Œ 처리 ν•  것을 μ œμ•ˆν•©λ‹ˆκΉŒ? μ•„λ¬΄κ²ƒλ„ν•˜μ§€ λ§ˆμ„Έμš”? κ·Έλž˜μ„œ μš”μ²­μ€ 쑰용히 μ£½μ„κΉŒμš”? 그것은 μ—„μ²­λ‚˜κ²Œ λ‚˜μ˜κ±°λ‚˜ 쒋지 μ•Šμ€ UX / api κ΄€λ¦¬μž…λ‹ˆλ‹€.

ID둜 ν•­λͺ©μ„ μΏΌλ¦¬ν•˜κ³  null을 λ°˜ν™˜ν•˜λ©΄ 그에 따라 UIμ—μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 데이터가 포함 된 경우 ν‘œμ‹œν•©λ‹ˆλ‹€.

μ—¬κΈ° @marnusw에 λ™μ˜ν•©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ λ‚˜λ¨Έμ§€ APIκ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ„ μ‹€μ œλ‘œ μ œμ–΄ ν•  수 μ—†μœΌλ―€λ‘œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν—ˆμš©ν•˜λŠ” μž‘μ—…μ΄ μ§€λ‚˜μΉ˜κ²Œ μ œν•œλ˜μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€. 404 => null 맀핑은 μƒλŒ€μ μœΌλ‘œ 직관적 인 의미 μ²΄κ³„λ‘œ REST의 μš”μ²­ λͺ¨λΈ λ‹Ή 단일 λ¦¬μ†ŒμŠ€μ—μ„œ GraphQL의 μš”μ²­ λ‹Ή 닀쀑 λ¦¬μ†ŒμŠ€ (ν΄λΌμ΄μ–ΈνŠΈ κ΄€μ μ—μ„œ)둜 이동할 μˆ˜μžˆλŠ” λ™μ‹œμ— λˆ„λ½ 된 데이터가 ν­λ°œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

응닡 λ³€ν™˜κΈ°μ˜ 사전 νŒ¨ν‚€μ§€ λ²„μ „μ΄λ‚˜ μ‚¬μš©μžκ°€ http μƒνƒœ 처리λ₯Ό μ™„μ „νžˆ μ œμ–΄ ν•  μˆ˜μžˆλŠ” μš”μ²­ 처리 λ…Όλ¦¬μ˜ 좔상화와 같이이 λ™μž‘μ„ 옡트 μ•„μ›ƒν•˜λŠ” 더 쒋은 λ°©λ²•μ΄μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” 이전 ν–‰λ™μœΌλ‘œ 되 λŒλ¦¬λŠ” 것이 μ˜¬λ°”λ₯Έ 접근이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ ‘κ·Ό λ°©μ‹μ˜ 문제 쀑 μΌλΆ€λŠ” κ²°κ³Ό κ΅¬λ…μ—μ„œ 404이기 λ•Œλ¬Έμ— null 결과인지 λ˜λŠ” μ½˜ν…μΈ  μ—†μŒ λ°˜ν™˜ 201 λ˜λŠ” 이와 μœ μ‚¬ν•œ 것인지 μ•Œ 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ• ν”„ν„°μ›¨μ–΄μ—μ„œμ΄ 문제λ₯Ό μˆ˜μ •ν•˜μ—¬ μƒνƒœλ₯Ό ν™•μΈν•˜κ³  μ‹€μ œ μ„œλ²„ 였λ₯˜ λ©”μ‹œμ§€μ— μ•‘μ„ΈμŠ€ ν•  수 μ—†κΈ° λ•Œλ¬Έμ— 문제λ₯Ό κ°€μ •ν•˜λŠ” 였λ₯˜λ₯Ό λ°œμƒ μ‹œν‚€λ„λ‘ν–ˆμŠ΅λ‹ˆλ‹€. 특히 제 κ²½μš°μ—λŠ” μ‚¬μš©μž 지정 κ°€μ Έ 였기λ₯Ό μ‚¬μš©ν•˜μ—¬ 인증 토큰을 μ£Όμž…ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. , 그리고 apolloκ°€ 그것을 μ‚­μ œν•˜κΈ° 전에 응닡을 μ–»λŠ” 데 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ‚΄ μ†”λ£¨μ…˜μ€ ν•œ 가지 경우λ₯Ό μ œμ™Έν•˜κ³  μ•± μ „μ²΄μ—μ„œ λ‹€λ₯Έ 404 응닡에 λŒ€ν•œ λ‚˜μœ λ‹΄μš”μž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰