Apollo-link-rest: weixin mini ν”„λ‘œκ·Έλž¨μ—μ„œ apollo-link-restλ₯Ό μ‚¬μš©ν•  λ•Œ "헀더가 μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"κ°€ λ°œμƒν•©λ‹ˆλ‹€.

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

  • [x] has-reproduction

weixin mini ν”„λ‘œκ·Έλž¨μ—μ„œ apollo-link-restλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ μ•„λž˜μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

 Headers is not defined 
 ReferenceError: Headers is not defined

RestLink.tsμ—μ„œ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ°Ύμ•˜μ„ λ•Œ 헀더λ₯Ό μ°ΎμœΌλ €κ³ ν•˜μ§€λ§Œ μ ˆλŒ€μ μœΌλ‘œ weixin ν™˜κ²½μ—λŠ” 헀더가 μ—†μœΌλ―€λ‘œ λˆ„κ΅¬λ“ μ§€μ΄ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•΄ν‚Ήμ΄λ‚˜ μ†”λ£¨μ…˜μ„ 제곡 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

help wanted πŸ›  question❔

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

import clientFetch from 'unfetch';
import serverFetch, { Headers as ServerHeaders } from 'node-fetch';

const client = typeof document !== 'undefined';
global.Headers = client ? global.Headers : ServerHeaders;
const customFetch = client ? clientFetch : serverFetch;

const acmeLink = new JsonApiLink({
  …
  credentials: 'same-origin',
  customFetch,
});

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

μ•ˆλ…•ν•˜μ„Έμš” @ Janice1114 , μ €λŠ”

μ’…μ’… 헀더λ₯Ό μ‚¬μš©ν•  μˆ˜μ—†λŠ” 경우 κ°€μ Έ μ˜€κΈ°λ„ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ‘˜ λ‹€ μž‘λ™ ν•  μˆ˜μžˆλŠ” polyfill은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/bitinn/node-fetch

μ•ˆλ…•ν•˜μ„Έμš” @fbartho , λΉ λ₯Έ λ‹΅μž₯에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. polyfill을 μ‚¬μš©ν•˜μ—¬ 헀더 κ°€μ Έ 였기λ₯Ό ν™œμ„±ν™”ν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ μ—¬μ „νžˆ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

그리고 weixinμ—μ„œ μ°½ κ΄€λ ¨ λ³€μˆ˜λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” fetch에 wx.requestλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ polyfill이 μž‘λ™ν•˜μ§€ μ•Šμ„ 까봐 κ±±μ •λ©λ‹ˆλ‹€.

그리고 apollo-link-rest의 μ†ŒμŠ€ μ½”λ“œμ—μ„œ 헀더 루프λ₯Ό κ±΄λ„ˆ λ›°λŠ” 데 λ„μ›€μ΄λ˜λŠ” ν•΄ν‚Ήμ΄λ‚˜ κ΅¬ν˜„μ΄ μžˆλŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ λ‹€λ₯Έ μ‹œλ‚˜λ¦¬μ˜€μ— 맞게 λͺ‡ 가지 μ‚¬μš©μž 지정 μ˜΅μ…˜μ„ 제곡 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

래퍼 ν•¨μˆ˜λ₯Ό β€‹β€‹μ œκ³΅ν•˜κΈ° μœ„ν•΄ ApolloLinkRest에 customFetch 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.이 래퍼 ν•¨μˆ˜λŠ” Polyfillμ—μ„œ μ°½ 기반 헀더λ₯Ό κ°€μ Έ μ™€μ„œ κΈ°μ‘΄ 객체 ν•΄μ‹œλ‘œ 병합 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 것 (λ‚΄ λΈŒλΌμš°μ €μ—μ„œ μž‘μ„±λ˜μ§€ μ•ŠμŒ) :

function customFetch(url, options) {
   const headers = options.headers.entries().reduce((accumulator, h) => { accumulator[h[0]] = h[1];  return accumulator;}, {})
   return fetch(url, {…options, headers});
}
// Elsewhere: new RestLink({ customFetch, ...

μΉœμ ˆν•˜κ²Œ λ‹΅λ³€ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.이 polyfill을 weixin κ°œλ°œμ— μ‚¬μš©ν•˜λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

그리고 RestLink.tsμ—μ„œ μ†ŒμŠ€ μ½”λ“œλ₯Ό 읽으면 weixinμ—μ„œ μ‚¬μš©ν•  μˆ˜μ—†λŠ” 헀더에 μ•‘μ„ΈμŠ€ν•˜λ €κ³  μ‹œλ„ν•©λ‹ˆλ‹€. global λ³€μˆ˜λ₯Ό ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ RestLink μƒμ„±μž ν”„λ‘œμ„ΈμŠ€ 쀑에 μ‚¬μš©μž 지정 λ˜λŠ” μž¬μ •μ˜ 된 섀정을 적용 ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

멋진 νŒμ— λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @fbartho ,
헀더 문제 μˆ˜μ •

μ½”λ“œ PR을 λ§ˆμŠ€ν„°μ— 병합 ν•  수 μžˆλŠ”μ§€ κ²€ν† ν•˜κ³  도와 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?
도움이 될 수 μžˆλ‹€λ©΄ λŒ€λ‹¨νžˆ κ°μ‚¬ν•˜κ³  κ°μ‚¬ν•©λ‹ˆλ‹€.

"next": "^9.0.3" 에도 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 버전 ^8.1.0 μ—μ„œλ„μ΄ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‚΄ κ·Έλž˜ν”„ API의 경우 isomorphic-unfetch , 버전 ^3.0.0 을 μ‚¬μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 폴리 ν•„ν•©λ‹ˆλ‹€.

import fetch from 'isomorphic-unfetch'
const graphLink = createHttpLink({ uri, fetch })

κ·ΈλŸ¬λ‚˜ λ™μΌν•œ νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚˜λ¨Έμ§€ 링크둜 polyfill을 μ‚¬μš©ν•˜λ©΄ μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

const restLink = new RestLink({
  uri,
  customFetch: fetch,
})

λ˜ν•œ customFetch λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ node-fetch μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

import fetch from 'node-fetch'

function customFetch(url, options) {
  const headers = options.headers.entries().reduce((accumulator, h) => {
    accumulator[h[0]] = h[1]
    return accumulator
  }, {})
  return fetch(url, { ...options, headers })
}

const restLink = new RestLink({
  uri: CONTENTFUL_CONTENT_DELIVERY_API,
  customFetch,
})

두 경우 λͺ¨λ‘ λ‹€μŒ 개발 λͺ¨λ“œμ—μ„œ μ‹€ν–‰ν•  λ•Œ ReferenceError: Headers is not defined λ°›μ•˜μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ 아이디어λ₯Ό μ‚¬λž‘ν•˜κ³ , μ„œλ²„ ν™˜κ²½μ—μ„œ κ΅¬ν˜„ν•˜λŠ” 방법에 λŒ€ν•œ 지침을 제곡 ν•  수 μžˆλ‹€λ©΄ μ’‹μ•„ν•  κ²ƒμž…λ‹ˆλ‹€. 감사!

μžμ‹  만의 customFetch APIλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ Headers APIλ₯Ό 폴리 ν•„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

μƒ˜ν”Œ μ½”λ“œλ₯Ό μ›ν•˜μ‹œλ©΄ μ•Œλ €μ£Όμ„Έμš”.ν•˜μ§€λ§Œ λ„ˆλ¬΄ 번거 λ‘œμ›€μ—†μ΄ κ°€λŠ₯ν•˜λ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€. λ‚˜λŠ” μ§€κΈˆ λ°”λ‘œ λ‚΄ 컴퓨터에 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@fbartho κΈ°νšŒκ°€μžˆμ„ λ•Œ λͺ‡ 가지 μƒ˜ν”Œ μ½”λ“œκ°€ μ’‹μŠ΅λ‹ˆλ‹€! λ‚˜λŠ” 그것을 μ°” 렀지 만 μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 감사!

import * as Polyfillheaders from 'fetch-headers'
import fetch from 'isomorphic-unfetch'

// hook in the Headers polyfill for your environment!
global.Headers = global.Headers || Polyfillheaders;

function customFetch(url, options) {
  const headers = options.headers.entries().reduce((accumulator, h) => {
    accumulator[h[0]] = h[1]
    return accumulator
  }, {})
  return fetch(url, { ...options, headers })
}

const restLink = new RestLink({
  uri: CONTENTFUL_CONTENT_DELIVERY_API,
  customFetch,
})

μœ„μ™€ 같은 것이 @ 2wheelcoder νŠΈλ¦­μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

감사! 이 기회λ₯Ό μž‘μ€ ν›„ μ—¬κΈ°λ‘œ λ‹€μ‹œλ³΄κ³ ν•˜κ² μŠ΅λ‹ˆλ‹€.

@fbartho μ•ˆλ…•ν•˜μ„Έμš”! ios 9.3.5μ—μ„œμ΄ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. fetch-headers polyfill κ°€μ Έ 였기λ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
fetch-headers 의 헀더 μΈμŠ€ν„΄μŠ€μ— forEach λ©”μ„œλ“œκ°€μ—†λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€ (μ•„λž˜ μ°Έμ‘°).
image

λ‹€λ₯Έ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

@fbartho μ•ˆλ…•ν•˜μ„Έμš”! ios 9.3.5μ—μ„œμ΄ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. fetch-headers polyfill κ°€μ Έ 였기λ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
fetch-headers 의 헀더 μΈμŠ€ν„΄μŠ€μ— forEach λ©”μ„œλ“œκ°€μ—†λŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€ (μ•„λž˜ μ°Έμ‘°).
image

λ‹€λ₯Έ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

fetch polyfill을 μ‚¬μš©ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

μ•± μΈ‘μ—μ„œ 폴리 ν•„λ‘œμ΄ 문제λ₯Ό ν•΄κ²°ν•  수 있고 폴리 필을이 μ €μž₯μ†Œμ˜ μ’…μ†μ„±μœΌλ‘œ λ§Œλ“€κ³  싢지 μ•ŠκΈ° λ•Œλ¬Έμ—μ΄ 문제λ₯Ό λ‹«κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 polyfill둜 ν•΄κ²°ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” isomorphic-fetch, isomorphic-unfetch, fetch-headers 등을 μ‹œλ„ν–ˆκ³  항상 current.forEach not being defined λ˜λŠ” TypeError: Right-hand side of 'instanceof' is not an object λŒ€ν•œ 문제둜 λλ‚©λ‹ˆλ‹€. 도움이 ν•„μš”ν•˜μ„Έμš”?

@VinSpee 이 κ°€μ Έ 였기 polyfill을 μ‚¬μš©ν•΄ λ³Έ 적이 μžˆμŠ΅λ‹ˆκΉŒ?

@lintuming 예,ν•˜μ§€λ§Œ μ„œλ²„μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@VinSpee μ•„λ§ˆλ„ 이것을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. forEach λ°©λ²•μ΄μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
image
이 일을 λ°”λžλ‹ˆλ‹€.

@lintuming 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κ·Έκ²ƒμœΌλ‘œ λ‚˜λŠ” λ‹€μŒμ„ μ–»μŠ΅λ‹ˆλ‹€.

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

μ–½νžŒ 문제의 그물처럼 λ³΄μž…λ‹ˆλ‹€ 🀣

@VinSpee μ£„μ†‘ν•©λ‹ˆλ‹€, μ™œ 이런 일이 λ°œμƒν–ˆλŠ”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ 이것이 도움이 될 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client

λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

import clientFetch from 'unfetch';
import serverFetch, { Headers as ServerHeaders } from 'node-fetch';

const client = typeof document !== 'undefined';
global.Headers = client ? global.Headers : ServerHeaders;
const customFetch = client ? clientFetch : serverFetch;

const acmeLink = new JsonApiLink({
  …
  credentials: 'same-origin',
  customFetch,
});

@VinSpee λ‚˜λŠ” λ™μΌν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  있으며 μ†”λ£¨μ…˜ 으둜이 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³ ν–ˆμ§€λ§Œ μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
μž‘μ—… μ½”λ“œλ₯Ό κ³΅μœ ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@VinSpee μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

맞좀 κ°€μ Έ 였기λ₯Ό μ‚¬μš©ν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

import fetch from "isomorphic-fetch"

const restLink = new RestLink({
  uri: "https://...",
  customFetch: fetch,
  headers: {
    "Content-Type": "application/json",
  },
})

@VinSpee 의 μ†”λ£¨μ…˜μ€ Gatsby JS μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλ„ μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

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