LoginSignup
2
1

More than 5 years have passed since last update.

Proxy環境化で graphql-request を使う

Posted at

この記事は、proxy 環境下で graphql-request を使うためのメモです。

はじめに

環境

下記の環境で動作確認しました。

  • Windows 10 Pro (64bit)
  • Git for Windows 2.20.1
    • Git Bash : GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
  • Node.js 8.10.0
    • ここでは AWS Lambda でサポートされている最新の Node.js のバージョンに合わせています
  • npm 5.6.0
  • TypeScript 3.3

graphql-request の動作確認

サンプルプロジェクトの作成

Git Bash を起動して、適当な名前で node module を作成する。

$ mkdir sample-graphql
$ cd sample-graphql
$ npm init -y
Wrote to C:\work\sample-graphql\package.json:

{
  "name": "sample-graphql",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

graphql-request のインストール

npm install で graphql-request をインストールする。

$ npm install --save graphql-request
npm WARN registry Using stale data from https://registry.npmjs.org/ because the host is inaccessible -- are you offline?
npm WARN registry Using stale package data from https://registry.npmjs.org/ due to a request error during revalidation.
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN sample-graphql@1.0.0 No description
npm WARN sample-graphql@1.0.0 No repository field.

+ graphql-request@1.8.2
added 4 packages in 0.853s

サンプルコードの作成

graphql-request の Quickstart を参考にサンプルコードを作成する。

index.js
const GraphQLClient = require('graphql-request').GraphQLClient;

const endpoint = 'https://api.graph.cool/simple/v1/movies';
const options = {};
const client = new GraphQLClient(endpoint, options);

const query = `{
  Movie(title: "Inception") {
    releaseDate
    actors {
      name
    }
  }
}`

const variables = {};

client.request(query, variables)
  .then(data => console.log(JSON.stringify(data, null, 2)))
  .catch(error => console.error(error));

サンプルコードの実行

  • 非 Proxy 環境下での実行結果
$ node index.js
{
  "Movie": {
    "releaseDate": "2010-08-28T20:00:00.000Z",
    "actors": [
      {
        "name": "Leonardo DiCaprio"
      },
      {
        "name": "Ellen Page"
      },
      {
        "name": "Tom Hardy"
      },
      {
        "name": "Joseph Gordon-Levitt"
      },
      {
        "name": "Marion Cotillard"
      }
    ]
  }
}
  • Proxy 環境下での実行結果
    • 接続できずにタイムアウトで失敗
$ node index.js
{ FetchError: request to https://api.graph.cool/simple/v1/movies failed, reason: connect ETIMEDOUT 13.33.0.193:443
    at ClientRequest.<anonymous> (C:\work\sample-graphql\node_modules\node-fetch\lib\index.js:1393:11)
    at emitOne (events.js:116:13)
    at ClientRequest.emit (events.js:211:7)
    at TLSSocket.socketErrorListener (_http_client.js:387:9)
    at emitOne (events.js:116:13)
    at TLSSocket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
  message: 'request to https://api.graph.cool/simple/v1/movies failed, reason: connect ETIMEDOUT 13.33.0.193:443',
  type: 'system',
  errno: 'ETIMEDOUT',
  code: 'ETIMEDOUT' }

Proxy 対応

https-proxy-agent のインストール

https-proxy-agent は Proxy 経由で HTTPS 接続する node module です。

$ npm install --save https-proxy-agent
npm WARN sample-graphql@1.0.0 No description
npm WARN sample-graphql@1.0.0 No repository field.

+ https-proxy-agent@2.2.1
added 6 packages in 1.766s

サンプルコードの修正と実行

graphql-requestnode-fetch を利用しており、 constructor の options に渡した値が Options として渡されます。

index.js
const GraphQLClient = require('graphql-request').GraphQLClient;
const HttpsProxyAgent = require('https-proxy-agent');

const endpoint = 'https://api.graph.cool/simple/v1/movies';
const options = {
  agent: new HttpsProxyAgent(process.env.HTTP_PROXY),
};
const client = new GraphQLClient(endpoint, options);

const query = `{
  Movie(title: "Inception") {
    releaseDate
    actors {
      name
    }
  }
}`

const variables = {};

client.request(query, variables)
  .then(data => console.log(JSON.stringify(data, null, 2)))
  .catch(error => console.error(error));

実行結果

$ node index.js
{
  "Movie": {
    "releaseDate": "2010-08-28T20:00:00.000Z",
    "actors": [
      {
        "name": "Leonardo DiCaprio"
      },
      {
        "name": "Ellen Page"
      },
      {
        "name": "Tom Hardy"
      },
      {
        "name": "Joseph Gordon-Levitt"
      },
      {
        "name": "Marion Cotillard"
      }
    ]
  }
}

おまけ:TypeScript の場合

https-proxy-agent.d.ts の作成

https-proxy-agent.d.ts
import { Agent } from 'http';

declare class HttpsProxyAgent extends Agent {
  constructor(uri: string | { protocol?: string; host?: string; hostname?: string; port?: string });
}

export = HttpsProxyAgent;

サンプルコードの作成

index.ts
import { GraphQLClient } from 'graphql-request';
import { Variables } from 'graphql-request/dist/src/types';
import HttpsProxyAgent from 'https-proxy-agent';

const endpoint = 'https://api.graph.cool/simple/v1/movies';
const options = {
  headers: {},
  agent: process.env.HTTP_PROXY ? new HttpsProxyAgent(process.env.HTTP_PROXY) : null,
};
const client = new GraphQLClient(endpoint, options);

const query = `{
  Movie(title: "Inception") {
    releaseDate
    actors {
      name
    }
  }
}`

const variables = {};

client.request(query, variables)
  .then(data => console.log(JSON.stringify(data, null, 2)))
  .catch(error => console.error(error));

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1