Node.jsで次のような処理をしたい
- テキスト・画像など外部ファイルがある
- つまり自サーバーの外にあるファイル
- その外部URLを同期・非同期に読み込みたい
これを実現するのは色々方法があります。
どれがいいかは状況にもよるので、
ここではNode.jsで外部ファイル読み込みの方法、
それをコード例付でまとめていきます。
このページの目次
1.requestで非同期的に外部ファイル読込
初めはrequestモジュールを使うやり方
ただしこのモジュールは非同期的な動作であり、
後述のような同期読み込みは対応してません。
これはインストールが必要なモジュールです。
▼ npm経由でインストするコマンド例
1 |
$ npm install request |
▼ 外部ファイル読み込みのコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const request = require('request'); /// CDNから外部JSコードを読み込み request({ url:'https://code.jquery.com/jquery.min.js' }, (err, res, body)=>{ /// bodyにはテキストデータが入る console.log('body : ', body); }); /// 外部の画像ファイルを読み込み request({ url:'https://fnordware.com/superpng/pnggrad8rgb.png' }, (err, res, body)=>{ /// bodyには生のデータが入る console.log('body : ', body); }); |
もし非同期関数 async function(){...} あるいは asyc ()=>{...} の中なら、await request({url: ...}) のように同期させることも可能です。
ただそれ以外では非同期な処理になります。
2.sync-requestで同期的な外部ファイル読込
非同期関数とかに関係なく、
外部ファイルを同期的に読み込みしたい…
それならsync-requestモジュールが便利です。
▼ npm経由でモジュールをインストする
1 |
$ npm install sync-request |
▼ 動的に外部ファイル読み込みのコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
const syncRequest = require('sync-request'); /// テキストで外部JSコード読み込み const outerCode = syncRequest( 'GET', 'https://code.jquery.com/jquery.min.js' ).body.toString(); /// 外部の画像ファイルを読み込み const outerImgData = syncRequest( 'GET', 'https://fnordware.com/superpng/pnggrad8rgb.png' ).body; console.log('outerImgData : ', outerImgData) /// => <Buffer 89 50 4e 47 0d... |
こんな風にスッキリと同期的に書けます。
返ってきた外部ファイルのデータ本体は 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.
もし外部ファイルがテキストなら、toString() を使ってテキストへと変換できます。バイナリの扱いはリファレンスを見てください。
非同期なrequestモジュールとも共存可能です。
3.httpsによる外部ファイル取得(面倒)
お次はhttpsモジュールによる外部ファイル読み込み
これはビルトインモジュールです。
だからインストールは必要ないけど、
読込処理を書くのがとてつもなく面倒くさいです。
▼ httpsでの外部ファイル読み込みのコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const https = require("https"); https.get('https://code.jquery.com/jquery.min.js', res=>{ if (res.statusCode < 200 || res.statusCode >= 300) { /// エラー時の処理 return; } let body = []; res.on('data', function(chunk) { /// チャンク(塊)ごとにデータ読込 body.push(chunk); }); res.on('end', function() { /// 全てのチャンク読み込み完了時 try { body = JSON.parse(Buffer.concat(body).toString()); } catch(e) { console.error(e); } //console.log('body : ', body) /// => [<Buffer 2f 2a 21 20 6a... }); }); |
見てわかるように長ったらしい処理です。
使うメリットがあるか正直分からない…
4.Fetch APIモジュールを使った方法
Fetch APIは普通のJSではお馴染みだと思います。
でもNode.jsではFetch APIは使用できません。
▼ そこでnode-fetchモジュールをインストール
1 |
$ npm i node-fetch |
▼ node-fetchモジュールの概要と使い方
慣れた方法を使いたいならこっちが良いかも
5.XMLHttpRequestモジュールを使う方法
普通のJavaScriptではXMLHttpRequestも使えます。
でもNode.jsではサポートされてません。
もしどうしてもXHRを使いたいなら、
モジュールとしてインストールする必要あります。
▼ npm経由でXMLHttpRequestインストール
1 |
$ npm install xhr2 |
▼ xhr2のパッケージ情報と使い方
今時XHRを使う出番は少なそう。
どうしても使いたいなら上記の方法もあります。
外部ファイル読み込みはCORSに注意が必要
あと外部ファイル読み込みの注意点について。
読み込み先がCORS許可してないとエラーが出ます。
▼ MDN : CORSについての解説
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです
なんだそれ?と思った人はググってください。
例えばサイトでRest APIを公開していて、それを外部サイトのJavaScriptから自由にアクセスできると不都合です。場合によってはセキュリティ的な危険が生じます。
だからJavaScriptでのやり取りを一部の場所にだけに制限する、これがCORSの基本理念になってます。
▼ より具体的なCORSの実例
外部からアクセスされる前提のサービスの場合、
上記記事のようにCORS設定を変更する必要もあります。
以上、Node.jsで外部ファイル読込でした。ではまた