Node.js で Headers is not defined エラーになった時の対処法

  • Node.js

graphql-requestを使っていた時に、実行してみたらHeadersが無いためか下記のエラーが出ました。

Headers is not defined

原因

調べたところ Node.js には fetch API が無いため、Headers オブジェクトを扱うことができないようです。今回使っていたgraphql-requestでは Headers を使用していたので、エラーとなっていました。

(graphql-request は Node.js にも対応しているような記載があったのですが、自分の使い方が間違っているのか何なのかよく分かりませんでした…)

解決策

fetch API を追加し、 Headers を使えるようにします。

node-fetch を追加

node-fetchhttps://www.npmjs.com/package/node-fetch)モジュールを追加します。

yarn add node-fetch

node-fetch をインポート

ファイルの上の行で import を書きます。今回は、graphql-requestの中で使っている Headers に対して適用させたいので、グローバル領域に定義します。

// global 領域に追加
import fetch from 'node-fetch';
global.Headers = fetch.Headers;

// Headers を使っているモジュールなど
import { gql, GraphQLClient } from 'graphql-request';

もし他のモジュール内でのエラーではなく自分のコード内のエラーなら、グローバル領域に定義せずに fetch.Headersを直接使用するのが良いと思います。

Typescript(非推奨な方法)

自分の場合はたまたま Typescript で書いていたのですが、Headers が無いと怒られるので一回別の定数に格納し any 型として対応しました。Typescript はまだちゃんと理解できていないので、雑すぎる対応方法です。。

import fetch from 'node-fetch';
const nodeFetch: any = fetch;
global.Headers = nodeFetch.Headers;