Node.jsで外部ファイルをURLから読み込みする5つの方法

Node.jsで次のような処理をしたい

  • テキスト・画像など外部ファイルがある
  • つまり自サーバーの外にあるファイル
  • その外部URLを同期・非同期に読み込みたい

これを実現するのは色々方法があります。

どれがいいかは状況にもよるので、
ここではNode.jsで外部ファイル読み込みの方法、

それをコード例付でまとめていきます。

1.requestで非同期的に外部ファイル読込

初めはrequestモジュールを使うやり方

ただしこのモジュールは非同期的な動作であり、
後述のような同期読み込みは対応してません。

これはインストールが必要なモジュールです。

▼ npm経由でインストするコマンド例

▼ 外部ファイル読み込みのコード例

もし非同期関数 async function(){...} あるいは asyc ()=>{...} の中なら、await request({url: ...}) のように同期させることも可能です。

ただそれ以外では非同期な処理になります。

2.sync-requestで同期的な外部ファイル読込

非同期関数とかに関係なく、
外部ファイルを同期的に読み込みしたい…

それならsync-requestモジュールが便利です。

▼ npm経由でモジュールをインストする

▼ 動的に外部ファイル読み込みのコード例

こんな風にスッキリと同期的に書けます。

 

返ってきた外部ファイルのデータ本体は body から参照可能。
テキスト・バイナリに関わらずBuffer型として返ってきます。

▼ Node.js Bufferクラスの概要

Buffer objects are used to represent a fixed-length sequence of bytes. Many Node.js APIs support Buffers.The Buffer class is a subclass of JavaScript's Uint8Array class and extends it with methods that cover additional use cases. Node.js APIs accept plain Uint8Arrays wherever Buffers are supported as well.

引用元 : https://nodejs.org/api/buffer.html#buffer

もし外部ファイルがテキストなら、toString() を使ってテキストへと変換できます。バイナリの扱いはリファレンスを見てください。

非同期なrequestモジュールとも共存可能です。

3.httpsによる外部ファイル取得(面倒)

お次はhttpsモジュールによる外部ファイル読み込み

これはビルトインモジュールです。

だからインストールは必要ないけど、
読込処理を書くのがとてつもなく面倒くさいです。

▼ httpsでの外部ファイル読み込みのコード例

見てわかるように長ったらしい処理です。

使うメリットがあるか正直分からない…

4.Fetch APIモジュールを使った方法

Fetch APIは普通のJSではお馴染みだと思います。

でもNode.jsではFetch APIは使用できません。

▼ そこでnode-fetchモジュールをインストール

▼ node-fetchモジュールの概要と使い方

慣れた方法を使いたいならこっちが良いかも

5.XMLHttpRequestモジュールを使う方法

普通のJavaScriptではXMLHttpRequestも使えます。

でもNode.jsではサポートされてません。

もしどうしてもXHRを使いたいなら、
モジュールとしてインストールする必要あります。

▼ npm経由でXMLHttpRequestインストール

▼ xhr2のパッケージ情報と使い方

今時XHRを使う出番は少なそう。

どうしても使いたいなら上記の方法もあります。

外部ファイル読み込みはCORSに注意が必要

あと外部ファイル読み込みの注意点について。

読み込み先がCORS許可してないとエラーが出ます。

▼ MDN : CORSについての解説

オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです

引用元 : https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

なんだそれ?と思った人はググってください。

例えばサイトでRest APIを公開していて、それを外部サイトのJavaScriptから自由にアクセスできると不都合です。場合によってはセキュリティ的な危険が生じます。

だからJavaScriptでのやり取りを一部の場所にだけに制限する、これがCORSの基本理念になってます。

▼ より具体的なCORSの実例

外部からアクセスされる前提のサービスの場合、
上記記事のようにCORS設定を変更する必要もあります。

以上、Node.jsで外部ファイル読込でした。ではまた