■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、下記 URL からダウンロードできます。
GitHub（https://–––––––––––––––––––––––––––––）
弊社サイト（http://–––––––––––––––––––––––––––）

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめに
本書は、Node.js の主要な API について用例を加えて解説したものです。
Node.js は JavaScript 言語の実行環境です。JavaScript は HTML ページを動的に変化させるプ
ログラミング言語で、ブラウザに実装された処理エンジンで実行されます。これに対し、Node.
js は HTML を含まない JavaScript だけで書かれたスクリプトを、独立したプロセスとして実行します。端的には、ブラウザに埋めこまれたエンジンを取りだして、Python や Perl などの汎用的なスクリプト言語と同じようにコンソールから実行できるようにしたものです。実際、Node.js のJavaScript エンジンは Google Chrome の V8 エンジンそのものです。
通常の JavaScript 処理に加え、Node.js には独立したエンジンとして利用できるように各種の機能が加わっています。スクリプトファイルを読みこむ、コマンドラインオプションから動作を変更
する、出力をコンソールに書きだすなどがその一例です。OS やプロセスとのインタフェース、ファイル I/O、ソケット、マルチスレッド・マルチプロセスなど OS のシステムコールから扱う機能が備わっているので、システム関連のプログラミングもできます。アプリケーション層プロトコ
ル、暗号化、圧縮解凍などのライブラリも充実しており、複雑な処理もほんの数行で書けます。言語的には JavaScript でも、オリジナルにはない機能で拡張された環境が Node.js API です。
Node.js はしばしばサーバサイド JavaScript と説明されます。これは動的にページを作成する、
HTTP データを解釈するといったウェブサーバに備わっている機能を有しているからです。しかし、それらは Node.js の機能の一部にすぎません。Node.js にはモダンなスクリプト言語なら備えていなければならない機能がひととおり備わっており、それだけでひとつの言語環境となっています。
Node.js API は機能別に約 50 個のモジュールに分かれており、本書ではこのうちのおおよそ半分、よく利用されるものを扱います。半分ではもの足りないと感じるかもしれませんが、膨大な Node.js API に必要な説明を加えながら記述をしていくと、1 冊では収まりません。ご了承くだ
さい。

iii

対象とする読者
Node.js が他のスクリプト言語と比較して優位な点は、ウェブフロントエンド開発者人口からくる JavaScript の利用者の多さにあります。これは、困ったときのノウハウがふんだんにある、あるいはコミュニティサポートが受けやすいだけでなく、フロントエンド開発者からシステム開発者への転身を容易にすることを意味します。本書は、バックエンドあるいはシステムアーキテクチャ
全体を視野に入れたエンジニアをめざすフロントエンド開発者を主な読者と想定しています。
Node.js はネットワークプログラミングも得意です。ネットワークの小さくはない遅延下でも、非同期的な処理によって効率的に動作します。また、クライアントとサーバで交換されるメッセー
ジをレディメイドのメソッドから容易に解析できます。メンテナンスあるいはトラブルシューティ
ングツールを C や Perl から移植したいと考えているネットワークエンジニアや、プログラミングを必要とする複雑なシステム構成を処理しなければならない NetOps にも、こうしたメリットをた
めしてほしいと思っています。
本書では、JavaScript の基本言語機能はおおむね理解しているとして話を進めます。たとえば、
if 文や for ループなどの制御構造、基本データ型、関数やメソッドなどベーシックな用法は、深くは説明しません。不如意なところは、MDN（Mozilla Developer Network）のリファレンスやチュートリアルを参照してください（巻末参考文献）。ただし、ECMA 6（ECMA Script 2015）以降に登場した Promise や Async などの非同期制御機能は Node.js で重要な技術なので、1 節を割いて説明を加えています（3.4 節）。これ以外にも、あまり触れる機会のない機能にもところどころで触れます。
Node.js はコンソール指向の環境です。Unix なら bash などのシェル、Windows ならコマンドプ
ロンプト（cmd.exe）あるいは PowerShell のベーシックな使いかたをマスターしていると想定し
ています。

本書の構成
本書は Node.js のモジュール単位で構成しています。互いに関連したモジュールはひとつの章にまとめ、それぞれの節が 1 モジュール、あるいは Node.js ドキュメントのセクションにおおむね対応しています。
● 第 1 章－操作編：REPL、Command Line Options、Modules● 第 2 章－環境編：OS、Process、Console● 第 3 章－ファイル編：Buffer、Path、File System● 第 4 章－ HTTP 編：HTTP、HTTPS、URL

iv

● 第 5 章－構造編：Errors、Events、Timers● 第 6 章－ネットワーク編：DNS、Net、UDP● 第 7 章－並列処理編：Child Processes、Cluster、Worker Threads

ところどころでピュアに JavaScript の話題に 1 節を割きますが、それらの節見出しの末尾には（JavaScript）と入れてあります。JavaScript の経験豊富な読者はスキップしてください。
Node.js のドキュメントは正確には API Reference Documentation（API 参照ドキュメント）ですが、本書では Node Docs と記載しています。Node Docs は初学者にはとっつきにくい構成なので、簡単な読みかたを付録 A.1 に示しました。Node Docs は 1 モジュール 1 セクションが基本ですが、モジュールに対応しないセクションもあります。たとえば、コマンドラインオプションを説明する Command Line Options は Node Docs の 1 セクションですが、モジュールはありません。
本書でセクションといったときは Node Docs を、モジュールといったときは読みこむことで実行できるソフトウェアの一部を指します。

開発環境
本書で利用する Node.js のバージョンは最新の長期サポート版である v12 です。より新しい
v13 は 2020 年 6 月にはサポート対象外になりますし、最近リリースされた v14 は 2020 年 10月にならないと一般向けとならないため、本書では扱いません。Node.js のバージョンおよびインストール方法は付録 A.1 を参照してください。
対象プラットフォームは Windows と Unix です。他のスクリプト言語同様、Node.js には OS 依
存性はほとんどありませんが、OS 固有のファイルシステムやネットワークインタフェースなど一部で依存性があるため、このふたつにかぎっています。基本は Windows をベースに話を進めます
が、OS 固有の話題で Windows では適切に動作しない機能は Unix を用います。
本 書 記 載 の コ ー ド の 動 作 は、Windows で は Windows 10 Professional と Home、Unix で はCentOS 7（Linux） で 確 認 し て い ま す。Unix は Windows 10 で 動 作 す る VMware Workstation（Player 15 と Pro 12）で仮想的に実行しています（付録 A.4）。これ以外の環境では記載とは異なる挙動を示すかもしれませんが、ご了承ください。

vサンプルコード
本書の例示コードは次のふたつの方法で書かれています。
● REPL● スクリプトファイル

REPL は Unix シェルや Windows コマンドプロンプトのコマンドのように、行単位でインタラ
クティブにスクリプティングをする環境です（1.1 節）。Node.js をコンソールから起動することで操作するもので、簡単な操作に向いています。また、repl.it などオンライン開発環境でも利用できるので、インストールせずとも Node.js をためせます（付録 A.1.6）。これら REPL 上の例示では、
REPL のプロンプトである > が行頭に加わっています（> は入力しない）。
コード 0.1 ● REPL による例示
C:\temp>node

Welcome to Node.js v12.13.0.

Type ".help" for more information.
> console.log('hello world')// これを入力

undefined// 入力の評価結果

hello world// 入力の実行結果

本書の横幅に収まらない長い 1 行の式は折り返しを┗ で示しています。
コード 0.2 ● REPL での長い式は折り返し> '192.168.184.10'.split('.').reverse().reduce((accum, current, idx) => accum +┗ 256**idx * current, 0).toString(2)'11000000101010001011100000001010'

REPL の例示では、可読性を考えて実行単位で空行を入れています。実際の REPL では空行は入りません。
スクリプトファイルは長めなものの例示で用いています。各行頭には参照のための行番号が入っています。
コード 0.3 ●スクリプトファイルによる例示（ﬁle.js）
1 console.log('hello world');vi// スクリプトの1行目

スクリプトのキャプションでは末尾にカッコ書きでファイル名を示しました。これらのファイ
ルは GitHub（https://github.com/stoyosawa/NodeBook）および出版社のウェブサイト
（http://cutt.jp/books/978-4-87783-489-0/）から入手できます。

実行例も含めて、例示に加えた注釈は JavaScript のコメントである // を使って示してあります。

もともとのコードあるいは実行例の表示には含まれていません。

使用した Windows は日本語版ですが、スクリプトなど用例で入出力する文字列はほぼ英文字に限っています（一部で UTF-8 表現の日本語もあり）。Node.js は Windows の主力言語である Shift
JIS はサポートしていません（7.1.1 節）。

vii

目

次

目次
はじめに........................................................................................................................ iii

第1章
1.1

REPL、コマンドラインオプション、モジュール .....1
REPL................................................................................................................. 2
1.1.1 キーバインド..................................................................................................................4
1.1.2 実行履歴...........................................................................................................................5
1.1.3 アロー関数式（JavaScript）......................................................................................7
1.1.4 アンダースコア.............................................................................................................91.1.5 _error.............................................................................................................................10
1.1.6 特殊コマンド...............................................................................................................11
1.1.7 REPL クラス................................................................................................................11
1.1.8 カスタム特殊コマンド.............................................................................................12
1.1.9 テンプレートリテラル（JavaScript）................................................................141.1.10 プレースホルダ（JavaScript）...........................................................................15
1.1.11 REPL コンテクスト................................................................................................18
1.1.12 REPLServer イベント............................................................................................20

1.2

コマンドラインオプション.............................................................................23
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6

1.3

モジュール.......................................................................................................31
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7

1.4

viii

式の評価........................................................................................................................23
バージョン...................................................................................................................24
ヘルプ.............................................................................................................................25
非推奨警告の抑制......................................................................................................26
実験的モジュールの使用........................................................................................28
環境変数........................................................................................................................30
require...........................................................................................................................31
exports プロパティ...................................................................................................33
モジュールパス..........................................................................................................36
グローバルフォルダ.................................................................................................37
module.main................................................................................................................38
NPM................................................................................................................................41
グローバルオブジェクト........................................................................................43

まとめ..............................................................................................................45

目 次

第2章
2.1

OS、プロセス、標準入出力、コンソール ..............47
OS....................................................................................................................47
2.1.1 定数.................................................................................................................................48
2.1.2 メソッド........................................................................................................................51
2.1.3 プロセス優先度..........................................................................................................54

2.2

プロセス...........................................................................................................58
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.2.6
2.2.7
2.2.8
2.2.9

2.3

標準入出力.......................................................................................................81
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
2.3.7
2.3.8

2.4

第3章
3.1

ストリーム...................................................................................................................82
標準出力........................................................................................................................84
標準入力........................................................................................................................85
Readable ストリームのイベント.........................................................................88
Readable ストリームのメソッド.........................................................................90
バッファリング..........................................................................................................91
Readline モジュールの標準入力..........................................................................94
Readline によるスピナー.......................................................................................97

コンソール.......................................................................................................99
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5

2.5

定数.................................................................................................................................58
コマンドライン引数.................................................................................................60
argparse パッケージ（NPM）...............................................................................61
メモリ使用量...............................................................................................................67
パターンのある配列の生成（JavaScript）.......................................................70
CPU 利用量...................................................................................................................71
Process.on メソッド.................................................................................................73
その他メソッド..........................................................................................................76
プロセス間通信..........................................................................................................80

console.table...............................................................................................................99
console.time と時間計測...................................................................................... 102
分割代入とスプレッド構文（JavaScript）.................................................... 107
BigInt（JavaScript）.............................................................................................. 111
Console クラス........................................................................................................ 113

まとめ........................................................................................................... 115

バッファ、パス、ファイルシステム .................... 117
バッファ........................................................................................................ 117
3.1.1
3.1.2
3.1.3
3.1.4
3.1.5
3.1.6

バッファの作成....................................................................................................... 118
符号なし 8 ビット整数以外の要素.................................................................. 120
バッファサイズ....................................................................................................... 122
文字エンコーディング.......................................................................................... 123
バッファの操作....................................................................................................... 126
Set（JavaScript）..................................................................................................... 133

ix

3.1.7 バイナリ操作............................................................................................................ 137
3.1.8 16 進ダンプ.............................................................................................................. 140

3.2

ファイルパス................................................................................................ 143
3.2.1 定数.............................................................................................................................. 145
3.2.2 メソッド..................................................................................................................... 146

3.3

ファイルシステム......................................................................................... 149
3.3.1
3.3.2
3.3.3
3.3.4
3.3.5
3.3.6
3.3.7
3.3.8
3.3.9

3.4

非同期処理の同期的処理（JavaScript）................................................... 175
3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.4.6
3.4.7
3.4.8

3.5

第4章
4.1

ファイル読みこみ（同期版）.............................................................................. 150
ファイル読みこみ（非同期版）......................................................................... 152
ファイル書きだし................................................................................................... 155
ファイルストリーム.............................................................................................. 157
終わりのないストリーム..................................................................................... 160
ファイル情報............................................................................................................ 163
ファイル操作............................................................................................................ 166
ファイル監視............................................................................................................ 170
ディレクトリ操作................................................................................................... 173
非同期メソッドの入れ子..................................................................................... 175
Promise の作成........................................................................................................ 177
Promise 完了後の処理.......................................................................................... 178
複数タスクの処理................................................................................................... 181
Async と await......................................................................................................... 185
すべてが完了後に事後処理................................................................................. 186
ひとつでも完了すれば事後処理........................................................................ 189
fs Promise API......................................................................................................... 191

まとめ........................................................................................................... 194

HTTP .............................................................195
HTTP プロトコル........................................................................................ 196
4.1.1 HTTP バージョン................................................................................................... 197
4.1.2 要求メッセージ....................................................................................................... 197
4.1.3 応答メッセージ....................................................................................................... 198

4.2

定数............................................................................................................... 200

4.3

HTTP get.................................................................................................... 201
4.3.1
4.3.2
4.3.3
4.3.4
4.3.5
4.3.6
4.3.7

x

IncomingMessage オブジェクト...................................................................... 202
IncomingMessage イベント............................................................................... 204
ClientRequest オブジェクト.............................................................................. 207
オプション................................................................................................................ 209
タイムアウト............................................................................................................ 211
Promise（JavaScript）.......................................................................................... 214
HTTPS get................................................................................................................. 217

目 次

4.3.8 HTTP/HTTPS リダイレクト............................................................................... 219
4.3.9 自己署名証明書....................................................................................................... 222
4.3.10 HTML ボディ解析................................................................................................ 224

4.4

HTTP request........................................................................................... 227
4.4.1
4.4.2
4.4.3
4.4.4

4.5

HTTP サーバ............................................................................................... 240
4.5.1
4.5.2
4.5.3
4.5.4
4.5.5
4.5.6
4.5.7
4.5.8

4.6

第5章
5.1

URL の構造と URL オブジェクト..................................................................... 268
国際化ドメイン名................................................................................................... 269
URL............................................................................................................................... 271
URLSearchParams................................................................................................. 274
Punycode................................................................................................................... 277

まとめ........................................................................................................... 279

エラー、タイマー、イベント、ユーティリティ .....281
エラー........................................................................................................... 282
5.1.1
5.1.2
5.1.3
5.1.4
5.1.5

5.2

http.createServer.................................................................................................... 241
http.Server................................................................................................................ 243
clientError イベント.............................................................................................. 247
request イベント.................................................................................................... 249
データのチャンク形式.......................................................................................... 254
ソケット..................................................................................................................... 255
HTTPS サーバ.......................................................................................................... 258
REST サーバ.............................................................................................................. 261

URL.............................................................................................................. 267
4.6.1
4.6.2
4.6.3
4.6.4
4.6.5

4.7

http.request.............................................................................................................. 227
PUT.............................................................................................................................. 229
その他のメソッド................................................................................................... 230
Keep-Alive................................................................................................................. 236

Error の型.................................................................................................................. 282
スタックトレース................................................................................................... 284
SystemError.............................................................................................................. 287
非同期メソッドと try-catch............................................................................... 291
エラーファースト................................................................................................... 294

タイマーとイベントループ.......................................................................... 295
5.2.1
5.2.2
5.2.3
5.2.4
5.2.5
5.2.6
5.2.7

Timer オブジェクト............................................................................................... 295
タイマー再開............................................................................................................ 298
setImmediate........................................................................................................... 301
ジェネレータ（JavaScript）................................................................................ 304
setImmediate による非同期化.......................................................................... 309
process.nextTick..................................................................................................... 311
処理の順序................................................................................................................ 312

xi

5.3

イベント........................................................................................................ 316
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6

5.4

ユーティリティ............................................................................................. 330
5.4.1
5.4.2
5.4.3
5.4.4
5.4.5
5.4.6

5.5

第6章
6.1

型チェックメソッド.............................................................................................. 330
テキストのフォーマット..................................................................................... 332
オブジェクトの詳細表示..................................................................................... 333
デバッグ用ログ....................................................................................................... 339
非推奨化..................................................................................................................... 341
関数の Promise 化.................................................................................................. 342

まとめ........................................................................................................... 347

DNS、Net、UDP ...........................................349
DNS.............................................................................................................. 350
6.1.1
6.1.2
6.1.3
6.1.4
6.1.5
6.1.6

6.2

EventEmitter............................................................................................................ 317
On と once................................................................................................................. 320
複数のリスナー....................................................................................................... 321
EventEmitter の操作.............................................................................................. 322
EventEmitter のイベント..................................................................................... 325
関数の EventEmitter 化........................................................................................ 327

OS 依頼の名前解決................................................................................................. 350
dns.lookup オプション......................................................................................... 353
直接通信による名前解決..................................................................................... 356
逆引き.......................................................................................................................... 359
サーバ変更................................................................................................................ 361
dns Promise API..................................................................................................... 362

TCP ソケット.............................................................................................. 365
6.2.1 IP アドレス検証メソッド.................................................................................... 366
6.2.2 net.createConnection............................................................................................ 368
6.2.3 Socket イベント－ Daytime............................................................................... 370
6.2.4 Socket メソッド－ FTP......................................................................................... 375
6.2.5 Socket コンストラクタ－ Whois...................................................................... 380
6.2.6 Socket プロパティ－ HTTP................................................................................ 384
6.2.7 net.createServer...................................................................................................... 387
6.2.8 Server イベント....................................................................................................... 389
6.2.9 Server プロパティとメソッド........................................................................... 392
6.2.10 TCP クライアントサーバ－ Echo.................................................................. 394

6.3

Unix ドメインソケット............................................................................... 401
6.3.1
6.3.2
6.3.3
6.3.4

xii

パス（Unix）............................................................................................................. 401
パス（Windows）.................................................................................................... 403
Unix ドメインクライアントサーバ－ Time................................................. 404
エポックタイム（JavaScript）........................................................................... 407

目 次

6.4

UDP.............................................................................................................. 410
6.4.1
6.4.2
6.4.3
6.4.4
6.4.5

6.5

第7章
7.1

まとめ........................................................................................................... 432

マルチスレッド、マルチプロセス .......................435
子プロセス.................................................................................................... 436
7.1.1
7.1.2
7.1.3
7.1.4
7.1.5
7.1.6
7.1.7
7.1.8
7.1.9

7.2

SJIS（NPM）. ............................................................................................................ 437
execSync.................................................................................................................... 440
オプション................................................................................................................ 442
exec.............................................................................................................................. 448
ChildProcess イベント......................................................................................... 450
ChildProcess プロパティ..................................................................................... 452
execFile と execFileSync...................................................................................... 454
fork とプロセス間通信......................................................................................... 457
デーモン化................................................................................................................ 462

クラスタ........................................................................................................ 465
7.2.1
7.2.2
7.2.3
7.2.4

7.3

dgram.createSocket.............................................................................................. 412
Socket メソッド－ DNS........................................................................................ 414
Socket メソッド－ DNS connect 版................................................................. 421
Socket イベント－ NTP........................................................................................ 423
UDP クライアントサーバ－ Echo.................................................................... 429

簡単なクラスタ....................................................................................................... 466
Worker イベント.................................................................................................... 468
プロセス間通信....................................................................................................... 470
複数のワーカー....................................................................................................... 473

マルチスレッド............................................................................................. 477
7.3.1
7.3.2
7.3.3
7.3.4
7.3.5

簡単なスレッド....................................................................................................... 478
Worker イベント.................................................................................................... 479
Worker オプション................................................................................................ 481
workerData............................................................................................................... 483
プロセス間通信（MessagePort）. .................................................................... 486

7.4

性能............................................................................................................... 488

7.5

まとめ........................................................................................................... 491

xiii

付録

ツール.................................................................493

A.1

Node.js........................................................................................................ 493

A.2

curl............................................................................................................... 500

A.3

OpenSSL.................................................................................................... 505

A.4

VMware Workstation Player............................................................... 511

A.5

Wireshark.................................................................................................. 513

参考文献................................................................................................................... 518
索  引........................................................................................................................ 522

xiv

第1章
REPL、コマンドラインオプション、
モジュール

第1章

REPL、コマンドラインオプション、モジュール

本章では、Node.js の操作で必要になる REPL、コマンドラインオプション、モジュールを説明します。
REPL は Read-Eval-Print Loop の略で、行単位でコードを実行する対話環境です。コードを入力（Read）すると Node.js エンジンがコードを評価（Eval）し、その結果を出力（Print）します。最後の Loop はこの入力－評価－出力を繰り返すことで、簡単な操作やテストができることを示しています。Windows コマンドプロンプトや Unix シェルでコマンドを順に実行するのと似た環境です。レプルと読みます。
コマンドラインオプションは、Node.js エンジンの挙動を起動時にデフォルトから変更するのに使います。ここでは、非推奨となった API を説明する Deprecated APIs セクションも取り上げます。
モジュールは、外部から読みこむスクリプトファイルです。本書でこれから順を追って説明する

HTTP も Worker Threads も Node.js に組みこまれたモジュールで、関数 require から明示的に読みこんでから利用します。モジュールは自作もできるので、同じコードをコピー・ペーストせず
とも使いまわせるようになります。どこかの誰かがすでに作成した機能なら、自作せずとも NPM（Node Package Manager）からダウンロードして読みこむだけです。また、モジュールに関連してグローバルオブジェクトにも触れます。

1

1

REPL、コマンドラインオプション、モジュール

本章では Node Docs の次のセクションを取り上げます。
● REPL● Command Line Options● Deprecated APIs
● Modules● Globals

1.1 REPLREPL は、コンソールから node（実行形式の処理プログラム）を実行すれば起動します。コン

ソールは Unix ならシェル、Windows ならコマンドプロンプト（cmd）や PowerShell です。起動後に現れるプロンプトは > です。ここから、スクリプトを書く要領でコードを書きだします。
コード 1.1 ● REPL の起動と実行
C:\temp>node

Welcome to Node.js v12.10.0.

Type ".help" for more information.
> let x = 10
undefined> x
10> x + 111

行末を示すセミコロンは必要ありませんが、つけてもかまいません。

文を実行すると、その評価結果が表示されます。最初の let 文の評価結果は undefined です。x に 10 を代入しているので 10 が返ってきそうですが、代入という操作自体が返す戻り値がundefined だからです。続いて x だけを評価すると、10 が返ってきます。式は即座に評価されるので、x + 1 のように数値演算を入力すれば計算結果が返ってきます。

複数行からなる式も扱えます。1 行目を入力すると、次に ...（ドット 3 つ）が表示されるので続けて入力します。

2

1.1 REPL

コード 1.2 ●複数行の式

1> [1, 2, 3].forEach(function(elem) {... console.log(elem);
... }

2

... );
13

2
3

undefined4

開きカッコが正しく閉じていないといつまでも ... のままで実行しないので、入れ子が多いと5

REPL を終了してコマンドプロンプトに戻るには、Ctrl-D（^D）を入力します。他の言語の6になります。ただし、REPL 環境は後述の REPL モジュールで構築されているので、REPL オブジ

7

きには注意してください。収拾がつかなくなったら、Ctrl-C（^C）で REPL プロンプトに戻れます。
REPL 環境によくある quit や exit などの終了命令は Node.js には備わっていないので、エラー
ェクトに属する .exit から終了できます。
コード 1.3 ● REPL の終了> quitThrown:// エラー

ReferenceError: quit is not defined> exitThrown:// エラー

ReferenceError: exit is not defined> .exit

C:\temp>// 終了

REPL は Node.js プロセス上で動作しているので、Process モジュールの exit メソッドからも抜けることができます（2.2.8 節）。
コード 1.4 ● process.exit から終了
> process.exit()
C:\temp>

付 録

3

1

REPL、コマンドラインオプション、モジュール

1.1.1

キーバインドREPL の行の編集には、Unix bash などが採用している Unix 系では一般的なキーバインドが利用できます。
表 1.1 ● REPL の行の編集に使用するキー
機能

キーバインド

行頭に移動

Ctrl-A、Home

行末に移動

Ctrl-E、End

カーソルを右に移動

Ctrl-F、右矢印（→）

カーソルを左に移動

Ctrl-B、左矢印（←）

1 文字削除

Ctrl-D、Delete

カーソル位置から右をすべて削除

Ctrl-K

スクリーンのクリア

Ctrl-L

前の実行式（履歴）Ctrl-P、上矢印（↑）

次の実行式（履歴）Ctrl-N、下矢印（↓）

コマンド補完TAB

コマンド補完（TAB）は、Unix シェルや開発環境でよくある、コマンドや関数を途中まで入力した状態で呼びだすと候補を示す機能です。たとえば、JavaScript の配列オブジェクトで利用可能なメソッドのリストは、オブジェクト名と .（ドット）を入力したところで補完をかけると表示されます。

コード 1.5 ●コマンド補完> let a = [1, 2, 3]// 配列を作成> a.constructor.name// 念のため、オブジェクトが配列であることを確認

undefined'Array'> a.

a.__defineSetter__a.__lookupGetter__a.isPrototypeOfa.propertyIsEnumerable

a.valueOf

a.__lookupSetter__a.__proto__

a.hasOwnProperty

a.concata.constructor

a.copyWithina.filtera.finda.findIndex

a.entries
a.flata.includes4// ここでタブを押下

a.__defineGetter__a.every

a.flatMap
a.indexOfa.filla.forEacha.join1.1 REPL

a.keysa.lastIndexOf

a.map

a.reduceRighta.reversea.shifta.pop

a.pusha.slicea.somea.splice

a.toLocaleStringa.unshifta.values

1

a.reduce
a.sort2

a.toString

3

a.length

4

1.1.2

実行履歴

5

履歴（ヒストリ）は REPL 環境で実行したこれまでの式の記録です。上述のように上矢印（↑）

6

で過去の式を直近のものから順次閲覧でき、そこから改行キーで同じものを再度実行できます。編集も可能です。過去の式から直近の式に移動するには下矢印（↓）キーです。

7

履歴情報はファイルに収容されているので、REPL セッションを終了して再開しても呼びだせます。ファイルでは、直近の式が上部に、古いものが下部に置かれています。履歴を消去するには履
歴ファイルを削除します。
Node.js には履歴にかかわる環境変数がふたつあります（1.2.6 節）。
● NODE_REPL_HISTORY － 履 歴 情 報 を 収 容 す る フ ァ イ ル。 デ フ ォ ル ト は ホ ー ム デ ィ レ ク

ト リ 直 下 の .node_repl_history で す。 ホ ー ム デ ィ レ ク ト リ は Windows な ら C:\
Users\<User>、Unix なら ~ です。

● NODE_REPL_HISTORY_SIZE －履歴ファイルに収容できる履歴の数。デフォルトは 1,000。

環境変数が未定義のときはデフォルトが用いられます。次の例では、履歴ファイルを C:\

temp\.history に変更したうえで REPL を実行し、その内容を表示しています。
コード 1.6 ● NODE_REPL_HISTORY から履歴ファイルを指定
C:\temp>set NODE_REPL_HISTORY=C:\temp\.history// 環境変数セット

C:\temp>node

Welcome to Node.js v12.10.0.

Type ".help" for more information.
> 1 + 2付 録

3> .exit5

1

REPL、コマンドラインオプション、モジュール

C:\temp>type C:\temp\.history
1 + 2// ファイル表示（Unixならcat）

履歴機能を無効化するには、NODE_REPL_HISTORY に空文字を設定します。
コード 1.7 ●履歴機能の無効化
C:\temp>set NODE_REPL_HISTORY=''

再度有効化するには、環境変数をアンセットします。
コード 1.8 ●履歴ファイルの再有効化
C:\temp>set NODE_REPL_HISTORY=// 環境変数をアンセット

C:\temp>node

Welcome to Node.js v12.10.0.

Type ".help" for more information.
> 100 + 200 + 300
600> .exit
C:\temp>type \Users\foo\.node_repl_history
100 + 200 + 300// デフォルト履歴ファイル

履歴情報は REPLServer オブジェクト（1.1.7 節）の history プロパティに配列（Array）の形で格納されているので、REPL 環境からも表示できます。
コード 1.9 ● REPL オブジェクトから履歴の表示> repl.repl.history.slice(0, 10)['repl.repl.history','repl.repl.context','let x = 10;','process.version','process.env',
'c',
'b',
'a',

'let [a, b, c] = [1, 2, 3]',]6

'2 ** 2'// sliceで直近10件のみ表示

1.1 REPL

repl.repl.history と repl が重なっているのは、repl モジュール（オブジェクト）にある

REPLServer オブジェクトにある history 配列だからです。

1

すこともできます。要素番号とともにヒストリ情報を印字してから、その番号 + 1 の要素を eval2

このオブジェクトを利用すれば、bash のように履歴のインデックス番号から過去の式を呼びだ関数から実行するだけです。+1 なのは、番号／要素の印字式そのものが 0 番目に加わり、ひとつ3ずれるからです。

4

コード 1.10 ● repl.history から要素番号を指定して eval で実行// 直近の3つの履歴を表示（0番目は表示コマンドそのもの）> repl.repl.history.slice(0,3).forEach((elem,idx)=>console.log(idx,elem))

5

0 repl.repl.history.slice(0,3).forEach((elem,idx)=>console.log(idx,elem))
1 2 ** 8
2 3 ** 4

6

undefined> eval(repl.repl.history[2])2567// 上記の1番目の2の8乗を実行

アスタリスク（*）をふたつ重ねた ** 演算子はべき乗で、JavaScript の Math.pow メソッドのショートカット版です。ECMA 6 から導入された機能で、Node.js では v7.5 以降から利用可能
です。

1.1.3

アロー関数式（JavaScript）

コード 1.2 では、配列の forEach メソッドに指定する（無名の）関数を function(elem){...} のように明示的に function キーワードを使って記述しました。これに対し、コード 1.10

では ( 関数引数 )=> ブロック内の式という簡易表記を使いました。この矢印を間に挟む形式をアロー関数式（arrow function expression）といいます。

JavaScript では ECMA 6 から導入されました。Node.js でも以前から利用できましたが、すべての機能が実装されたのは v6 くらいです。

以下、配列の map メソッドで指定する関数を例に、用法を何パターンか示します。

コード 1.11 ●アロー関数式− 1 引数、return のみ// パターン1> [1, 2, 3].map((elem) => { return elem+1; })// パターン2[ 2, 3, 4 ][ 2, 3, 4 ]付 録> [1, 2, 3].map(function(elem) { return elem+1; })7

1

REPL、コマンドラインオプション、モジュール> [1, 2, 3].map(elem => { return elem+1; })// パターン3> [1, 2, 3].map((elem, idx) => { return elem+idx; })// パターン4> [1, 2, 3].map(elem => elem+1)// パターン5[ 2, 3, 4 ][ 1, 3, 5 ][ 2, 3, 4 ]パターン 1 がオリジナルの関数表現です。

パターン 2 では、パターン 1 から function キーワードを抜き、function 文とブロックの間に =>（アロー）を挟んでいます。関数引数は丸カッコ（()）でくくったまま残してもかまいませんが、ひとつしかなければパターン 3 のように前後のカッコも省けます。ただし、引数が複数あるときは、ステップ 4 で示したようにカッコを残さなければなりません。

パターン 5 ではブロックの中カッコ（{}）と return も省いています。評価結果が戻されるのでなくても動作します。

return 値が配列などオブジェクトのケースの用例を示します。

コード 1.12 ●アロー関数式−オブジェクトを返す> [1, 2, 3].map(elem => ['a', 'b'])// パターン6> [1, 2, 3].map(elem => {x: elem+1})// パターン7> [1, 2, 3].map(elem => ({x: elem+1}))// パターン8[ [ 'a', 'b' ], [ 'a', 'b' ], [ 'a', 'b' ] ][ undefined, undefined, undefined ][ { x: 2 }, { x: 3 }, { x: 4 } ]パターン 6 のように配列を返すときは、特にトリックは必要ありません。そのまま書きます。
しかし、パターン 7 のようにオブジェクトを返すときは、中カッコが関数ブロックと解釈されます。この関数は何も返さないので、どの要素も undefined です。オブジェクトの戻り値として解釈させるにはパターン 8 のように丸カッコでくくります。

この他にも this の扱いなど、変数スコープにかかわる相違点がありますが、本書の範囲で普通に Node.js を使うのなら、これだけ知っておけばよいでしょう。

本書では REPL の例示ではアロー関数式を、スクリプトファイルでは従来の function を用いています。Node Docs からもわかるように、最近の表記はアロー関数式が大勢を占めていますが、あえて古流の作法で書いています。function というキーワードがあれば grep するときに便利だ

8

1.1 REPLという、個人的な理由からです。

1.1.4

1

アンダースコア

2

直近に評価された式の結果は、_（アンダースコア）という特殊変数に格納されます。

たとえば、1 + 1 を評価すれば _ には 2 が格納されるので、続いて _ を評価すればやはり 2 が

3

ここからは _ に number という文字列が代入されます。文字列であることは評価結果がシングル

4得られます。この _ に typeof 演算子を適用すると、このときの評価結果が _ に格納されるので、クォート（'）でくくられていることからわかります。

5

コード 1.13 ●変数 _ は直近の評価結果を収容

6> 1 + 1
2

7

> _
2

> typeof _'number'> _'number'_ には代入もできますが、それ以降は評価結果が代入されなくなります。たとえば、いったん _に 100 を代入すると、そのあとで 1 + 1 を評価しても、_ の値は 100 のままです。
コード 1.14 ●代入後、_ は直近の評価結果を反映しない> _ = 100

Expression assignment to _ now disabled.
100> 1 + 1
2

> _
100

付 録

「Expression assignment to _ now disabled」というメッセージは、評価結果代入機能が無効化されたという意味です。以降、このメッセージは表示されません。

9

1

REPL、コマンドラインオプション、モジュール

1.1.5 _error
Node.js v9.8 以降では、_error 変数も用意されました。これは直近の Error オブジェクト（JavaScript とほぼ同じ）を収容します。

コード 1.15 ●変数 _error は直近のエラーを収容（v9.8 以降）> quitThrown:// コマンドが存在しないのでエラーが上がる

ReferenceError: quit is not defined> _error.toString()// 直近のエラーオブジェクト（の文字列表記）'ReferenceError: quit is not defined'

以前のバージョン、たとえば v6.10.0 でためすと ReferenceError が上がります。
コード 1.16 ●変数 _error は v9.8 より前のバージョンではサポートされていない> process.version// Node.jsバージョンの確認（2.2.1節）> quit// コマンドが存在しないのでエラーが上がる'v6.10.0'

ReferenceError: quit is not definedat repl:1:1

at sigintHandlersWrap (vm.js:22:35)
at sigintHandlersWrap (vm.js:96:12)

at ContextifyScript.Script.runInThisContext (vm.js:21:12)
at REPLServer.defaultEval (repl.js:340:29)
at bound (domain.js:280:14)

at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:538:10)
at emitOne (events.js:101:20)

at REPLServer.emit (events.js:188:7)> _error.toString()// _errorがないのでエラーが上がる

ReferenceError: _error is not definedat repl:1:1

at sigintHandlersWrap (vm.js:22:35)
at sigintHandlersWrap (vm.js:96:12)

at ContextifyScript.Script.runInThisContext (vm.js:21:12)
at REPLServer.defaultEval (repl.js:340:29)
at bound (domain.js:280:14)

at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:538:10)
at emitOne (events.js:101:20)

10

1.1 REPL

at REPLServer.emit (events.js:188:7)

1

process.version は Process モジュールに用意されたプロパティで、Node.js バージョン番

2号を収容しています（2.2.1 節）。

1.1.6

3

特殊コマンド4

1.1 節冒頭で、.exit コマンドからでも REPL から抜けられると説明しました。こうしたドット（.）で始まる REPL 固有のコマンドを特殊コマンド（special commands）といいます。便利なものを次に示します。

5

表 1.2 ●特殊コマンドの例

6

コマンド.clear.exit.help.load file.save file

機能
REPL のコンテクスト（1.1.11 節）をクリアする。

7

REPL から抜ける。Ctrl-D と同じ。
特殊コマンドの簡易ヘルプを表示。

ヒストリを収容した file を読みこむ。たとえば、.load myHist.txt。
ヒストリを file に書きだす。たとえば、.save myHist.txt。

1.1.7 REPL クラス
node を実行したときに起動される REPL は、内部では REPL モジュールの REPLServer クラスで実装されています。REPL 環境から 1.1.2 節のように REPLServer オブジェクトの中身である

repl.repl.history を操作できるのは、このためです。

このクラスは外部からも利用できるので、これを使ってカスタムメイドの REPL 環境を構築できます。REPL モジュールを require から読みこみ、REPLServer オブジェクトの start メソッドを呼びだすだけです。require 関数は 1.3 節で説明するので、ここではモジュールを呼びだす
ときに必要な手続きだと思ってください。
コード 1.17 ●カスタム REPL（ほぼデフォルト）
const repl = require('repl');repl.start();

付 録

お仕着せの REPL モジュールをそのまま使っているだけなので、実行履歴をデフォルトのファイルに保存しないなど細かい点を除いては、挙動は node を実行したときと同じです。

11

1

REPL、コマンドラインオプション、モジュール

少しカスタマイズしてみましょう。

Node Docs の REPL セクションにある repl.start の項目を見ると、引数に options というオブジェクトが指定できることがわかります。この options にはいくつかのプロパティが用意されており、値を変更することで REPL の挙動を変更できます。

たとえば、prompt プロパティからはプロンプトをデフォルトの > から別のものに変更できます。次のスクリプトでは、プロンプトを bash 風に # に変えています。
コード 1.18 ●プロンプトをカスタマイズした REPL（replPrompt.js）
1 const repl = require('repl');2 repl.start({
3

prompt: '# ',// bash 風

4 });

1.1.8

カスタム特殊コマンド

Node Docs には、repl.start メソッドは repl.REPLServer オブジェクトを返すとあります。

Class:REPLServer の項目を見ると、REPLServer をカスタマイズできるいくつかのメソッドが並んでいます。ここでは、例として次に示す 3 つのメソッドから自作の特殊コマンドを作成します。
表 1.3 ● REPLServer メソッド
メソッド

clearBufferedCommand
defineCommand

displayPrompt

引数

機能

なし

バッファにある未実行のコマンドを消去する。v9.0.0 以降。

(key, cmd)
(preserve).key 特殊コマンドを作成。実行すると cmd が実行される。

プロンプトを表示してユーザ入力を受けつける。任意指定のpreserve を true にセットするとカーソル位置が先頭に戻らない。

作成するコマンドは 1.1.2 節で取り上げた直近の履歴情報の表示と配列番号による呼びだしです。それぞれ .lsHist と .execHist とします。
スクリプトは次のとおりです。

コード 1.19 ●特殊コマンドのカスタマイズ（replCommand.js）
1 let replServer = require('repl').start();2

3 replServer.defineCommand('lsHist', {4
5

12

help: 'Show history',
action: function() {