Apollo-link-rest: `@rest` рдирд┐рд░реНрджреЗрд╢ SSR рдкрд░рд┐рд╡реЗрд╢ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬрдире░ 2019  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link-rest

рдирдорд╕реНрддреЗ!

рдореЗрд░реЗ рдкрд╛рд╕ @rest рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдХреНрд╡реЗрд░реА рд╣реИ рдЬреЛ рд╡рд┐рдХрд╛рд╕/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд╕рд░реНрд╡рд░ (рдПрд╕рдПрд╕рдЖрд░) рдкрд░ рдПрдХ рд╣реА рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдПрдХ рд▓рдВрдмреЗ рдЧреБрдкреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

(рдпрджрд┐ рдореИрдВ @rest рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ SSR рджреЛрдиреЛрдВ рдореЗрдВ)ред

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕:

(node:26034) UnhandledPromiseRejectionWarning: Error: Network error: current.forEach is not a function
    at new ApolloError (.../demo-component/node_modules/src/errors/ApolloError.ts:56:5)
    at .../demo-component/node_modules/src/core/QueryManager.ts:512:31
    at .../demo-component/node_modules/src/core/QueryManager.ts:1046:11
    at Array.forEach (<anonymous>)
    at .../demo-component/node_modules/src/core/QueryManager.ts:1045:10
    at Map.forEach (<anonymous>)
    at QueryManager.broadcastQueries (.../demo-component/node_modules/src/core/QueryManager.ts:1039:18)
    at .../demo-component/node_modules/src/core/QueryManager.ts:411:18
(node:26034) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 5)
(node:26034) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

рдХреГрдкрдпрд╛ рд╕рд▓рд╛рд╣ рджреЗрдВ :/

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕реЗ рдореЗрд░реА рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЗрд░реА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд▓ рд╣реЛ рдЧрдИрдВ: D

if (global.Headers == null) {
    const fetch = require('node-fetch');
    global.Headers = fetch.Headers;
}

fetch-headers рдХреЗ рдмрдЬрд╛рдп fetch-headers node-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдЯрд┐рд╕ рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛!

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдереЛрдбрд╝рд╛ рдФрд░ рдЦреБрджрд╛рдИ, рдореИрдВ рдПрд╕рдПрд╕рдЖрд░ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдиреЛрдбрдЬреЗрдПрд╕ рдореЗрдВ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ,

рдФрд░ рдпрд╣ рдХреЛрдб рд╣реИ:

            client
                .query({query: Site, variables: {domain: "demo.example.com"}})
                .then(
                    () => console.log("Fullfilled"),
                    ({graphQLErrors, networkError, message, extraInfo}) =>
                        console.error("Rejected", graphQLErrors, networkError, message,extraInfo)
                )

рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде:

Rejected [] TypeError: current.forEach is not a function
    at /home/richard/Projects/skil/demo-component/node_modules/src/restLink.ts:671:13
    at Array.reduce (<anonymous>)
    at concatHeadersMergePolicy (/home/richard/Projects/skil/demo-component/node_modules/src/restLink.ts:664:23)
    at RestLink.request (/home/richard/Projects/skil/demo-component/node_modules/src/restLink.ts:1235:21)
    at ApolloLink.request (/home/richard/Projects/skil/demo-component/node_modules/apollo-link/src/link.ts:76:19)
    at /home/richard/Projects/skil/demo-component/node_modules/apollo-link/src/link.ts:78:26
    at ApolloLink.request (/home/richard/Projects/skil/demo-component/node_modules/src/ApolloClient.ts:139:16)
    at ApolloLink.request (/home/richard/Projects/skil/demo-component/node_modules/apollo-link/src/link.ts:76:19)
    at /home/richard/Projects/skil/demo-component/node_modules/apollo-link/src/link.ts:78:26
    at DedupLink.request (/home/richard/Projects/skil/demo-component/node_modules/apollo-link-dedup/src/dedupLink.ts:39:30) Network error: current.forEach is not a function undefined

restLink.ts:671 рдХреЛрдб рдХрд╛ рдпрд╣ рдмреНрд▓реЙрдХ рд╣реИ:

export const concatHeadersMergePolicy: RestLink.HeadersMergePolicy = (
  ...headerGroups: Headers[]
): Headers => {
  return headerGroups.reduce((accumulator, current) => {
    if (!current) {
      return accumulator;
    }
    if (!current.forEach) {
      current = normalizeHeaders(current);
    }
    current.forEach((value, key) => {    // <-- This line here
      accumulator.append(key, value);
    });

    return accumulator;
  }, new Headers());
};

https://github.com/apolographql/apolo-link-rest/blob/master/src/restLink.ts#L671

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдореИрдВ forEach рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

    Object.keys(current).forEach(key => {
      accumulator.append(key, current[key])
    })

рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

рдЪреБрдиреМрддреА , рдореИрдВ рдКрдкрд░ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛:

    if (!current.forEach) {
      current = normalizeHeaders(current);
    }

рдЪреВрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд┐рдлрд▓ рд░рд╣реЗрдЧрд╛, рдФрд░ рд╣рдореЗрд╢рд╛ normalizeHeaders() рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛?

рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдЕрдВрдЧ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдиреЛрдб new Headers() рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛ рд░рд╣рд╛ рд╣реИред рдПрдХ рдирдП рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ forEach рд╡рд┐рдзрд┐ рд╣реИред рдпрджрд┐ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо normalizeHeaders рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рд╣реЗрдбрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ new Headers() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рд╢реАрд░реНрд╖рд▓реЗрдЦреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рдЬрд╛рдПрдЧрд╛ред

рдЖрдкрдХрд╛ Object.keys(current).forEach() рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рджреЗ рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЙрд╕ рдкрд░ .forEach() рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдЧрд▓рд╛ рдЪрд░рдг...рдЖрдкрдХреЗ SSR рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ normalizeHeaders() рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ? рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╣реЗрдбрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдЖрд░ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рджреЗрдЦреЗрдВ #155) рд▓реЗрдХрд┐рди @fbartho рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

SSR рдЗрд╕ рд╕рдордп рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдкрд░реАрдХреНрд╖рд┐рдд рдпрд╛ рд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред рддрд░реНрдХ: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ SSR рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ Apollo GraphQL рд╕рд░реНрд╡рд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИред рдФрд░ рдореИрдВ рдЙрди рдкреАрдЖрд░ рдкрд░ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╡рд╣рд╛рдВ рдХреА рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ SSR рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреЗ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЗрдбрд░ рдХреЛ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ? @ рд░рд┐рдЪрд░реНрдб87

@ рдЯреЙрдордмрд╛рд░реНрдЯрди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╣реА рд╣реИ: рдЙрд╕ рдХреЛрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реЗрдбрд░ рд╣реИрд╢ рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИред

рдирдорд╕реНрддреЗ!

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж;)

рдореЗрд░реЗ index.js рдХрд╛ рдирд┐рдЪрд▓рд╛ рднрд╛рдЧ рдпрд╣ рд╣реИ:

if (global.Headers == null) {
    global.Headers = require("fetch-headers");
}

// Set up babel to do its thing... env for the latest toys, react-app for CRA
// Notice three plugins: the first two allow us to use import rather than require, the third is for code splitting
// Polyfill is required for Babel 7, polyfill includes a custom regenerator runtime and core-js
require('@babel/polyfill');
require('@babel/register')({
    ignore: [/\/(build|node_modules)\//],
    presets: ['@babel/preset-env', '@babel/preset-react'],
    plugins: [
        '@babel/plugin-syntax-dynamic-import',
        '@babel/plugin-proposal-class-properties',
        '@babel/plugin-transform-instanceof',
    ]
});

// Now that the nonsense is over... load up the server entry point
require('./server');

рддреЛ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИрдбрд░ рдкреЙрд▓реАрдлрд┐рд▓ рд╣реИ ( global.Headers рдХреЗ рдмрд┐рдирд╛ рднреА рдореБрдЭреЗ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рд╛ рд╣реИ) ...

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЧреНрд░рд╛рдлрд╝рдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдореЗрд░реЗ PHP рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдПрдкреАрдЖрдИ-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо + https://webonyx.github.io/graphql-php/) рдореЗрдВ рдХрд╕рдХрд░ рдПрдХреАрдХреГрдд рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдкреЛрд▓реЛ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдореИрдВ рдмрд╕ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд░рд┐рдПрдХреНрдЯ рдРрдк рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП :D

рдореЗрд░реЗ рдкрд╛рд╕ RestLink.ts рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╕рдордп рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреБрдЫ рд░рдгрдиреАрддрд┐рдХ console.log рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ current _seems_ рдПрдХ рдпреЛрдЬрдирд╛ рд╡рд╕реНрддреБ рд╣реИ, рд▓реЗрдХрд┐рди console.log рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ...

export const concatHeadersMergePolicy: RestLink.HeadersMergePolicy = (
  ...headerGroups: Headers[]
): Headers => {
  return headerGroups.reduce((accumulator, current) => {
    if (!current) {
      return accumulator;
    }

    console.log(current.constructor.name)
    if (!current.forEach) {
      current = normalizeHeaders(current);
    }
    console.log(current.constructor.name)

    Object.keys(current).forEach(key => {
      accumulator.append(key, current[key])
    })

    return accumulator;
  }, new Headers());
};

рджреЛ рдмрд╛рд░ "рд╣реЗрдбрд░" рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ ...

console.log(current.forEach) рдкреНрд░рд┐рдВрдЯ рдЖрдЙрдЯ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╣реЗрдбрд░ рдкреЙрд▓реАрдлрд┐рд▓ рдореЗрдВ forEach рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ?

рдореЗрд░рд╛ PHPStorm рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ headers рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЛрдб рдХреЛ рдиреЛрдб рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдкрд░ рдореБрдЭреЗ headers.forEach is not a function рдорд┐рд▓рддрд╛ рд╣реИ:

const Headers = require("fetch-headers");
const headers = new Headers();

console.log(headers)
console.log(headers.forEach)
console.log(!headers.forEach)

headers.forEach(h => console.log(h))

рдЖрдЙрдЯрдкреБрдЯ:

node /home/richard/Projects/demo-component/src/test.js 
Headers {}
undefined
true
/home/richard/Projects/demo-component/src/test.js:10
headers.forEach(h => console.log(h))
        ^

TypeError: headers.forEach is not a function
    at Object.<anonymous> (/home/richard/Projects/demo-component/src/test.js:10:9)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

рдЗрд╕реЗ рдореЗрд░реА рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЗрд░реА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд▓ рд╣реЛ рдЧрдИрдВ: D

if (global.Headers == null) {
    const fetch = require('node-fetch');
    global.Headers = fetch.Headers;
}

fetch-headers рдХреЗ рдмрдЬрд╛рдп fetch-headers node-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЛрдЯрд┐рд╕ рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛!

рдЗрд╕реЗ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдкреАрдЖрд░ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? https://github.com/apollographql/apollo-link-rest/blob/master/README.md , https://github.com/apollographql/apolo-link-rest/blob/master/docs/rest.md рдпрд╛ https://github.com/apolographql/apolo-link/blob/master/docs/source/links/rest.md ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MichelDiz picture MichelDiz  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

blatoo picture blatoo  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

i-Hun picture i-Hun  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fbartho picture fbartho  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Paddy-Hamilton picture Paddy-Hamilton  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ