Apollo-link-rest: "TypeError : ์•ž์œผ๋กœ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."

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

ํžˆ์•ผ,

apollo-link-rest๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Apollo devtools์—์„œ GraphiQL์„ ์—ด๋ฉด ํ•ญ์ƒ "TypeError : forward is not a function"์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜์˜ ์ „์ฒด ํ…์ŠคํŠธ :

{ "errors": [ { "message": "forward is not a function", "locations": [ "TypeError: forward is not a function\n at RestLink../node_modules/apollo-link-rest/bundle.umd.js.RestLink.request (http://localhost:3000/static/js/bundle.js:5566:24)\n at http://localhost:3000/static/js/bundle.js:5746:33\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:2602:20)\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:5745:31)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38654)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38421)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38085\n at new s (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:4855)\n at l.subscribe (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:6185)\n at n.<anonymous> (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38914)\n at n.t.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:52786)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:19519\n at n (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:36148)" ] } ] }

@rest ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ ๋ฐ ๋ณ€ํ˜•์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์™„์ „ํžˆ ์ฐจ๋‹จ๋˜๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ Apollo Client ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด @client ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฅ˜ ํŽ˜์ด๋กœ๋“œ์™€react-apollo์˜ ๊ตฌ์„ฑ ์š”์†Œ).

์„ธ ๊ฐ€์ง€ ์˜ˆ์ œ react-apollo ํ”„๋กœ์ ํŠธ (๋‹จ์ˆœ, ๊ณ ๊ธ‰, typescript)๋ฅผ ๋ณต์ œํ–ˆ๋Š”๋ฐ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘์— ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. # 121์€์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌํ•จ ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋ณ„๋„์˜ "๊ฐ€์ ธ ์˜ค๊ธฐ ์‹คํŒจ"๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž ์žฌ์  ์ธ ์›์ธ์œผ๋กœ @rest ๋˜๋Š” @client ์ง€์‹œ๋ฌธ์ด ๋ˆ„๋ฝ ๋˜์—ˆ๋‹ค๋Š” ์–ธ๊ธ‰๋„ ์žˆ์ง€๋งŒ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ์™€ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ˆ„๋ฝ ๋œ ์ง€์‹œ๋ฌธ์ด ๋ฒ”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ํ•˜๋ ค๋ฉด ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณต์ œํ•˜๊ณ  Chrome์—์„œ Apollo ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์„ค์น˜ ๋ฐ ์‹œ์ž‘ํ•˜๊ณ  ์—ฝ๋‹ˆ ๋‹ค (์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํ˜„์žฌ ๋ฒ„์ „์€ 70.0.3538.77์ž…๋‹ˆ๋‹ค).

์ด๊ฒƒ์„ ๋ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜๊ณ , ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ , ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์‹ญ์‹œ์˜ค!

bug ๐Ÿ› enhancement๐Ÿ’ก has-reproduction help wanted ๐Ÿ›  questionโ”

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

์•ˆ๋…•ํ•˜์„ธ์š”! ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์›์ธ์„ ์กฐ๊ธˆ ์‚ดํŽด๋ณผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ž‘์—… ์€ apollo-client-devtools์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ๋„์ฐฉํ•˜๋ฉด forward ๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. !isRestQuery ์ˆ˜ํ‘œ๋ฅผ !isRestQuery && forward ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ์œ„์˜ ์˜ค๋ฅ˜๋ฅผ ์—†์•จ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธ / ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

์ด ๋„์„œ๊ด€์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

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

์ €๋Š” GraphIQL์ด apollo-link-state / apollo-link-rest๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํฌ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  Apollo ๊ฐœ๋ฐœ ๋„๊ตฌ์˜ GraphiQL์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. JSONPlaceholder API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ https://jsonplaceholder.typicode.com์œผ๋กœ ์„ค์ •-์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ฒ˜์Œ์— ์–ป์€ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

apollo-devtools-initial

๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ :

apollo-devtools-users

๋˜๋Š” "๊ฐ„๋‹จํ•œ"์˜ˆ์ œ ํ”„๋กœ์ ํŠธ :

apollo-devtools-simple

๋‚ด๊ฐ€ ์•Œ์•„ ์ฐจ๋ฆฐ ๋˜ ๋‹ค๋ฅธ ์ ์€ "์บ์‹œ์—์„œ ์ฝ๊ธฐ"์˜ต์…˜์ด JSONPlaceholder API๋กœ ์ƒ์„ฑ ๋œ ์ƒˆ ํ•ญ๋ชฉ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. POST ๋ณ€ํ˜•์€ ์บ์‹œ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ๋กํ•˜์ง€๋งŒ ํ›„์† ์ฟผ๋ฆฌ๋Š” "์บ์‹œ์—์„œ ์ฝ๊ธฐ"๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ์—๋„ ์›๊ฒฉ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ•ญ๋ชฉ์ด ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋Œ€๋กœ ์›๊ฒฉ ๋์ ์—์„œ null์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์บ์‹œ์— ์ƒ์„ฑ๋˜๋ฏ€๋กœ "์บ์‹œ์—์„œ ์ฝ๊ธฐ"๊ฐ€ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์•„๋งˆ๋„ apollo-link-rest์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ๋งŒ ์—ฌ์ „ํžˆ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

GraphiQL, forward is not a function ์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. cache ์ด์™ธ์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋…€์„๋“ค์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ, ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค :(

@cstoddart ์บ์‹œ ํŒจ๋„์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ devtools์—†์ด ์บ์‹œ๋ฅผ ๋ณด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ €๋„ ๊ฐ™์€ ์ผ์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @cgatian ์˜ˆ, ์บ์‹œ ํŒจ๋„์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŒŒ์†์ด ์˜ค๋žซ๋™์•ˆ ๋ฐœ์ƒํ•˜๋ฉด ์•„ํด๋กœ์˜ ํˆด์ฒด์ธ์„ ์ˆ˜์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. apollo-link-rest๋Š” ์—ฌ์ „ํžˆ ํ™œ๋ฐœํžˆ ์ž‘์—… ์ค‘์ž…๋‹ˆ๊นŒ?

@heymanhn- ์˜ˆ ApolloLinkRest๋Š” ์ ๊ทน์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. PR์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ApolloDevTools์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ํ˜ธํ™˜๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋›ฐ์–ด ๋“ค๊ฑฐ๋‚˜ ๊ธฐ๊บผ์ด ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋ฌด์—‡์ด ๋น ์กŒ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋„๋ก ๋„์ „ํ•˜๊ณ  ๋‹น์‹ ์˜ ๊ธฐ์—ฌ๋ฅผ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋”์—†๋Š” ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋‚œ์ด ์ ์€ ํŒŒ์†์ด๋‹ค๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๊ทธ๋ž˜์„œ ๊ทธ ์•„ํด๋กœ ๋งํฌ๊ฐ€-๋‚˜๋จธ์ง€๋Š” ์ด์ œ๊นŒ์ง€ ApolloDevTools๊ณผ ํ˜‘๋ ฅ ์•Œ๊ณ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด, ๋ถ„๋ช…ํžˆํ•˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ์ธ์ ์œผ๋กœ React-Native์™€ ํ•จ๊ป˜ apollo-link-rest๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ 1 ๋…„ ์ „์— ApolloDevTools๋Š” React-Native์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๊ทธ ์ดํ›„๋กœ ๊ทธ๊ฒƒ์„ ๊ณ ์ณค๋‹ค ๊ณ  ๋ฐœํ‘œํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ ํŒ€์˜ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ApolloDevTools๋ฅผ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”! ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์›์ธ์„ ์กฐ๊ธˆ ์‚ดํŽด๋ณผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ž‘์—… ์€ apollo-client-devtools์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ๋„์ฐฉํ•˜๋ฉด forward ๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. !isRestQuery ์ˆ˜ํ‘œ๋ฅผ !isRestQuery && forward ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ์œ„์˜ ์˜ค๋ฅ˜๋ฅผ ์—†์•จ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธ / ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

์ด ๋„์„œ๊ด€์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด ๊ฒฝ์šฐ IntrospectionQuery์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ์ขํ˜”์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” apollo-client์™€ apollo-link-rest ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์บ์‹œ ์Šคํ‚ค๋งˆ (์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ์ œ์™ธํ•˜๊ณ  ์„œ๋ฒ„ ๋‚˜ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ ๋‚ด apollo devtools๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆ˜์ •์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ํ•œ ์ง€์ ์—์„œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด ๊ฒฝ์šฐ IntrospectionQuery์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ์ขํ˜”์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” apollo-client์™€ apollo-link-rest ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์บ์‹œ ์Šคํ‚ค๋งˆ (์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ์ œ์™ธํ•˜๊ณ  ์„œ๋ฒ„ ๋‚˜ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ ๋‚ด apollo devtools๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆ˜์ •์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ํ•œ ์ง€์ ์—์„œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

ApolloDevTools๊ฐ€ ์ง€๋‚œ ๋ชฉ์š”์ผ์— React Native Debugger์—์„œ apollo-link-state, apollo-link-Rest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ํ™œ์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? @ edgars-sirokovs์— ์–ด๋–ค ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ApolloDevTools๊ฐ€ ์ง€๋‚œ ๋ชฉ์š”์ผ์— React Native Debugger์—์„œ apollo-link-state, apollo-link-Rest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ํ™œ์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? @ edgars-sirokovs์— ์–ด๋–ค ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@fbartho 2.2.4

@fbartho๋Š” ๋ฐฉ๊ธˆ ๋‹ค์‹œ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋” ์ด์ƒ ๋น„์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค-์บ์‹œ๋ณด๊ธฐ๋ฅผ ์Šคํฌ๋กค ํ•  ์ˆ˜์—†๊ณ  ๋ฌธ์„œ ํƒ์ƒ‰๊ธฐ์— ์Šคํ‚ค๋งˆ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( typeDefs ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋œ ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํ‚ค๋งˆ

๋ฌธ์„œ ํƒ์ƒ‰๊ธฐ๊ฐ€ apollo-link-rest๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•„์š”๋กœํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ•  ์ผ์ด ์žˆ๊ฑฐ๋‚˜ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ PR ์ˆ˜๋ฝ!

์บ์‹œ ๋ทฐ๋ฅผ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ApolloDevTools ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์ด @ edgars-sirokovs๋ฅผ ๋ฐœ์ „ ์‹œ์ผœ์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

ApolloDevTools๊ฐ€ ์ง€๋‚œ ๋ชฉ์š”์ผ์— React Native Debugger์—์„œ apollo-link-state, apollo-link-Rest์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ํ™œ์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? @ edgars-sirokovs์— ์–ด๋–ค ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

simple ํ”„๋กœ์ ํŠธ๋กœ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  Apollo DevTools ํƒญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ญ์ƒ ๋น„์–ด ์žˆ๊ณ  ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/apollographql/apollo-link-rest/tree/master/examples/simple

@fbartho ๋‚˜๋Š” react-native-debugger๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘์—์„œ ์ž‘์—…ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋˜‘๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ค์ • ๋˜๋Š” ์‚ฌ์šฉ์ค‘์ธ ๋ฒ„์ „์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์ง€ ๋งŒ GraphiQL ํƒญ์€ ์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ํƒญ๋งŒ : https://github.com/apollographql/apollo-client-devtools/issues/227

์ด ๋™์ผํ•œ ๋ฌธ์ œ๋กœ ๋ณด์ด๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— devtools GraphiQL์—์„œ ๋กœ์ปฌ ์Šคํ‚ค๋งˆ Docs ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋‚ด๋ถ€ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‘๋‹ต ํŒจ๋„์— [object Object] ๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์ฝ˜์†” ๋ณด๊ณ ์„œ [Network error]: TypeError: forward is not a function

{
  __schema {
    types {
      name
    }
  }
}

๋‚ด ํด๋ผ์ด์–ธํŠธ์—๋Š” graphql ์„œ๋ฒ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { persistCache } from 'apollo-cache-persist';
import localForage from 'localforage';
import typeDefs from './schema.graphql';
import { resolvers } from './resolvers';
import { link } from './link';
import { initialState } from './initialState';
export let client;
export async function createApolloClient() {
  const cache = new InMemoryCache();
  await persistCache({ cache, storage: localForage, serialize: false });
  client = new ApolloClient({ cache, link, resolvers, typeDefs });
  window.__APOLLO_CLIENT__ = client;
  cache.writeData({ data: initialState });
  return client;
}

https://spectrum.chat/apollo/apollo-link-state/client-has-typedefs-but-no-docs-in-graphiql~8a80e439-3257-4fce-a666-a1e75c3cec63 ์ฐธ์กฐ

์ด๊ฒƒ์ด ์œ„์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์ฒ˜๋Ÿผ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์ •ํ™•ํžˆ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฒฐ๊ตญ ํ•ด๊ฒฐ ํ•œ ์˜ค๋ฅ˜๋กœ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ด€๋ จ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‚˜๋Š” ์ตœ๊ทผ์—์ด ์˜ค๋ฅ˜๋กœ ์‹คํ–‰ apollo-link-rest ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— @apollo/client .

tl; dr ๋ฌธ์ œ๋Š” uri ๋ฐ link ๋ฅผ ์ƒˆ๋กœ์šด ApolloCient ์ •์˜ ํ•  ๋•Œ ์˜ต์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๋‹น์‹ ์€ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค uri ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค HttpLink ์‚ฌ์šฉ createHttpLink ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ from() ๋ฐ›๋Š” ๋‹น์‹ ์˜ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฒฐํ•ฉํ•˜๋Š” link ์˜ต์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜.

๋‚˜๋จธ์ง€ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋‚ด ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { ApolloClient, InMemoryCache } from '@apollo/client';

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
});

๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด RestLink ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ถ”๊ฐ€ link ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

import { ApolloClient, InMemoryCache } from '@apollo/client';
import { RestLink } from 'apollo-link-rest';

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
  link: restLink,
});

๊ทธ๋Ÿฌ๋‚˜์ด ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด TypeError: forward is not a function ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งํฌ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๋” ์ฝ์–ด ๋ณธ ํ›„, uri ๋ฐ link ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค (๋ช…์‹œ ์ ์œผ๋กœ ์–ธ๊ธ‰ ๋œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ๋„์žˆ์„ ์ˆ˜ ์žˆ์Œ). ๋™์‹œ์— ApolloClient ์ •์˜์˜ link ์˜ต์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜. ์ด ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ I ์ œ๊ฑฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค uri ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋งŒ๋“œ๋Š” ๋™์•ˆ HttpLink ๋‚ด๊ฐ€ ๊ทธ๋•Œ์™€ ๊ฒฐํ•ฉ ๋œ ๊ฒƒ์„ RestLink ์‚ฌ์šฉํ•˜์—ฌ from() ์™€ ๋ชจ๋“  ๊ฒƒ์ด ๋งˆ์นจ๋‚ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค ( ๋ฌธ์„œ ์— ๋”ฐ๋ผ RestLink ๊ฐ€ HttpLink ์•ž์— ์™€์•ผํ•ฉ๋‹ˆ๋‹ค) :

import {
  ApolloClient, InMemoryCache, from, createHttpLink,
} from '@apollo/client';
import { RestLink } from 'apollo-link-rest';
const httpLink = createHttpLink({
  uri: '/api/graphql',
});

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: from([restLink, httpLink]),
});

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @crbanman ๋‹น์‹ ์ด ๋‚ด ํ•˜๋ฃจ๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ’ฏ

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