備忘録的プログラミングリファレンス

Node.js

 Node.js はサーバーで実行することが想定された JavaScript です。
 元はサーバーで実行することが想定されていましたが、現在はデスクトップアプリの開発やシステム用のスクリプトとしても利用されています。

 スクリプト言語としては JavaScript ですが、Node.js ではファイル操作やネットワーク通信が使用できます。ただし、ブラウザで使用するような DOM がデフォルトでありません。
 Node.js ではモジュールの追加という形で機能を充実させます。ブラウザ上で動く JavaScript とは特異なところがあります。

Node.js による js ファイルの実行
$ node example.js

ページ内 Index

Node.js と API

 ブラウザ上で動作する JavaScript には標準で DOM を含んだ Web API と呼ばれる API が連携されています。
 一方、ブラウザに依らない Node.js では DOM、ファイル操作やネットワーク通信機能といった API は既存で含まれておらず、インクルード( require() )することで機能を拡充します。

 本来の JavaScript の言語仕様に、 DOM や Node.js で利用できるファイル操作やネットワーク通信機能は含まれていません。(たまにそのようなことが記載された内容を見かけます。)
 Node.js では、DOM やファイル操作やネットワーク通信機能は API(Application Programming Interface)として JavaScript にインクルードする形をとります。

 例えば以下のようなコアモジュールとして API が用意されています。

Node.js に用意された API(コアモジュール)の一部
コアモジュール名概要
fsファイル操作
osOS 関連のユーティリティ
pathファイルパスに関するユーティリティ
httpHTTP に関連するユーティリティ
httpsHTTPS に関連するユーティリティ
netソケットベースのユーティリティ
util各種ユーティリティ

 必要なファイル操作やネットワーク通信といった API はモジュールとして用意されており、reauire() によってインクルードします。

モジュールの読み込み
const fs = require( 'fs' );

 上記の例はファイルに関するモジュールをインクルードする例です。

 JavaScript で利用できるモジュールには、既に用意されている上記のようなコアモジュールがあります。
 また、作成することもでき、サードパーティによるものあります。

インストール

 まずは、Node.js の Ubuntu におけるインストール方法です。

 先にインストール済みのパッケージをアップデートしておきます。

$ sudo apt update

 インストール済みかは Node.js のバージョンによって確認することができます。

$ nodejs
コマンド 'nodejs' が見つかりません。次の方法でインストールできます:
sudo apt install nodejs

 以下のように Node.js をインストールします。パッケージ名はnodejsです。

$ sudo apt install nodejs

 パッケージ名を検索するには seach オプションを利用します。

$ sudo apt search nodejs

 Node.js では モジュール管理を npm によって行います。npm もインストールしておきましょう。

$ sudo apt install npm

js ファイルの実行

 Node.js において JavaScript ファイル( 拡張子 .js ファイル )を実行するには node コマンドを使用します。

Node.js による js ファイルの実行
$ node example.js

環境変数の取得

 Node.js のプログラム上から OS の環境変数を取得するには process.env を使用します。

 例えば以下のコードを実行するとすべての環境変数を取得することができます。

環境変数をすべて表示
console.log( process.env );

引数の取得

 node コマンドで .js ファイルを実行するときに引数を渡したいときがあります。
 コマンドラインの引数を取得するには process.argv を使用します。

node コマンドラインの引数を取得
// 例えば node example.js a b
console.log( process.argv );

// [a,b,c] と出力されます。

 process は、Node.js より OS のプロセスを管理するためのものです。process は require() する必要はありません。

コアモジュール

 Node.js のコアモジュールは Node.js に用意された既存のモジュールです。ファイル操作やネットワーク通信といった OS 依存の API を利用するにはコアモジュール使用します。

コアモジュール名概要
assertテスト用
buffer入出力(ファイル操作やネットワーク)に使用する一時メモリ
child_processプロセス操作
clusterマルチプロセス操作
crypto暗号化
dnsDNS(Domain Name System)関連
domainドメインごとの入出力操作に利用
events非同期に関するイベントのためのユーティリティ
fsファイル操作
httpHTTP に関連するユーティリティ
httpsHTTPS に関連するユーティリティ
netソケットベースのユーティリティ
osOS 関連のユーティリティ
pathファイルパスに関するユーティリティ
punycodeドメイン名の符号化に関するユーティリティ
querystringURL の解析、作成ユーティリティ
readlineコマンドラインプログラムに関するユーティリティ
smallocbuffer 用メモリに関するユーティリティ
streamストリームベースのユーティリティ
string_decoder文字列への変換
tlsOpenSSL によるTLS/SSL通信関連
ttyTTY 関連
dgramUDP(User Datagram Protocol) 関連
urlURL の解析
util各種ユーティリティ
vmバーチャルマシンで JavaScript 実行するためのユーティリティ
zlibzlib の圧縮・解凍

 コアモジュールを読み込みには require() を使用します。
 引数に上記のコアモジュール名を指定します。コアモジュール名は文字列としてシングルコーテーション' 'またはダブルコーテーション" "で囲みます。

require( 'fs' );

 モジュールは自作することもできます。*.js といった js というファイル拡張子が付いたファイルとして作成します。
 サードパティから提供されるモジュールは npm モジュールとしてnode_modulesディレクトリ以下に置きます。

モジュールの作成

 モジュールの作成は以下のようにします。

モジュールの作成
/* -- 以下を example_module.js というファイルで作成 -- */

const abc = "a";

function exec_example(){
	return true;
}

class example_module(){
	constructor( v ){
	this._val = val;
  }

  get value(){
	return this._val;
  }

  set value( v ){
	this._val = v;
  }
}

module.exports = abc;
module.exports = exec_example();
module.exports = example_module();

 モジュールを読み込むためには require() メソッドでファイルパスまたはパッケージ名を指定します。

 例えば上記の例 example_module.js をモジュールとして読み込むためには以下のような構文を使用します。

モジュールの読み込み
const exec_example_module = require( './example_module.js' );

 require() メソッドの引数にはファイルパス、コアモジュール名、npm によるパッケージ名が指定できます。

 import 文でモジュールを読み込むこともできます。

モジュールの読み込み
import * from './example_module.js';

npm モジュール

 サードパーティーによるモジュールの多くは npm モジュールとして扱います。サードパーティーによるモジュールはnode_modulesディレクトリ以下に置きます。

 npm モジュールを読み込みには require() を使用します。
 引数に上記の npm モジュール名を指定します。
 npm モジュールはnode_modulesディレクトリ以下にあることが前提で、モジュール名の指定だけで./../といったディレクトリ指定は必要ありません。モジュール名は文字列としてシングルコーテーション' 'またはダブルコーテーション" "で囲みます。

require( 'fs' );

 npm モジュールを require() で指定すると、以下のディレクトリの順に指定されたファイルを探します。

  • /home/*/test_project/node_modules/
  • /home/*/node_modules/
  • /home/node_modules/
  • /node_modules/

 自作したモジュールはnode_modules以下においてはいけません。このディレクトリ以下のモジュールは自動で管理されているため改変されたり削除される可能性があります。

コアモジュールの利用

 この節ではモジュールの利用方法について解説します。ファイル操作、ネットワーク通信( HTTP サーバーの構築 )、プロセス管理について取り上げています。

ファイル操作

 Node.js でファイル操作を行うためには fs コアモジュールをインクルードします。

fs コアモジュールの読み込み
const fs = require( 'fs' );

 fs コアモジュールには以下のようなメソッドが用意されています。

fs のメソッド概要
.readdir( URL, function )ディレクトリ一覧の取得。第1引数はファイルのURL、第2引数はコールバック関数
.readFile( URL, type, function )ファイルの読み込み。第1引数はファイルのURL、第2引数は文字コード、第3引数はコールバック関数
.readFileSync( URL, type, function )非同期処理によるファイルの読み込み。第1引数はファイルのURL、第2引数は文字コード、第3引数はコールバック関数
.writeFile( URL, data, function )新規ファイルの追加。第1引数はファイルのURL、第2引数はファイルの内容、第3引数はコールバック関数
.writeFileSync( URL, data, function )非同期処理による新規ファイルの追加。第1引数はファイルのURL、第2引数はファイルの内容、第3引数はコールバック関数
.appendFile( URL, data, function )ファイルに内容を追加。第1引数はファイルのURL、第2引数は追加内容、第3引数はコールバック関数
.unlink( URL, function )ファイルを削除。第1引数はファイルのURL、第3引数はコールバック関数
.createReadStream( URL, type )ストリームによるデータの読み込み。引数はファイルの URL。コールバック関数は .on() メソッドで使用
.createWriteStream( URL )ストリームによるデータの書き込み。引数はファイルの URL

 コールバック関数にはファイル操作のエラーが起きた場合の処理などを定義します。

ディレクトリ一覧の取得

 指定したディレクトリ内のファイルやディレクトリを取得するには readdir() メソッドを使用します。

readdir()
const fs = require( 'fs' );

fs.readdir( pth.join( __dirname ), function( error, files ){
	if( error ) return console.error( 'directry read error.' );

	for (const file of files) {
		console.log( file );
	}
} );

ファイルの読み込み readFile()

 ファイルの読み込みは、readFile() または readFileSync() を使用します。
 readFile() は同期処理でファイル読み込みができます。readFileSync() は処理が終わるまで待ち状態になります。例外処理 try ~ catch といった対策が必要になります。。

readFileSync()
const fs = require( 'fs' );

fs.readFile( 'example.txt', { encoding: 'utf-8' }, function( error, data ){
	if( error ) return console.error( 'file read error.' );
} );

 第1引数はファイルの位置と名称を指定します。ここでは example.txt というファイル名を指定しています。

 Node.js には __dirname という位置指定が用意されています。実行ファイルの位置を示します。
 __dirname を指定すれば実行するソースファイルの位置から辿ったファイル指定にすることができます。
 上記の例のままでは実行ファイルを呼び出した位置からファイルを探すために必ずしも指定するファイルが見つかるとはいえません。このことを解消することができます。

__dirname
const fs = require( 'fs' );

fs.readFile( __dirname + 'example.txt', { encoding: 'utf-8' }, function( error, data ){
	if( error ) return console.error( 'file read error.' );
} );

 さらに path コアモジュールの .join() メソッドを利用してファイル指定を作成したほうがプラットフォームに依存しない汎用性をもたせることができます。

path.join()
const fs = require( 'fs' );
const pth = require( 'path' );

fs.readFile( pth.join( __dirname, 'example.txt' ), { encoding: 'utf-8' }, function( error, data ){
	if( error ) return console.error( 'file read error.' );
} );

ファイルの作成

 ファイルの新規作成を行うには、writeFile() または writeFileSync() メソッドを使用します。

writeFile()
const fs = require( 'fs' );
const pth = require( 'path' );

fs.writeFile( pth.join( __dirname, 'example.txt' ), 'ファイルの作成テスト\n', function( error ){
	if( error ) return console.error( 'file write error.' );
} );

 writeFile() は同期処理で利用します。ネットワーク経由でファイル処理をするには同期処理では不都合があります。
 ネットワーク経由では非同期処理による writeFileSync() メソッドを使用したほうがよいでしょう。

 writeFileSync() メソッドでは try ~ catch を併用したほうがよいでしょう。

path.join()
const fs = require( 'fs' );
const pth = require( 'path' );

try{
	fs.writeFile( pth.join( __dirname, 'example.txt' ), 'ファイルの作成テスト\n' );
} catch( error ) {
	console.error( 'file write error.' );
}

ストリーム

 ストリームとは、ファイルやネットワーク通信のポートを読み込み、書き込み、読み込みと書き込みの両方用に開いて連続的にデータを送受信する機能です。

 以下はストリームによるファイルの読み込み例です。

createReadStream()
const fs = require( 'fs' );

const rstream = fs.createReadStream( 'example.txt', { encoding:'utf8' } );
rstream.on( 'data', function( data ){
	console.log( data );
} );
rstream.on( 'end', function( data ){
	console.log( '>> end of data' );
} );

 pipe を使って読み込んだ内容を書き込むこともできます。

createReadStream()
const fs = require( 'fs' );

const rstream = fs.createReadStream( 'example.txt' );
const wstream = fs.createWriteStream( 'new.txt' );

rstream.pipe( wstream );

ネットワーク通信( HTTP サーバーの構築 )

 Node.js は HTTP( Hypertext Transfer Protocol )プロトコルを利用してネットワーク通信を行うことができます。
 http や https コアモジュールを利用すると HTTP プロトコルを介したネットワーク通信を行うことができ、web サーバーのようにブラウザのリクエストに対してレスポンスを返すことができます。

 以下の例は HTTP を使用した例です。現在の多くは HTTPS を使用していますが、話を簡単にするために HTTP の例を上げます。

createReadStream()
const http = require( 'http' );

const svr = fs.createServer( function( request, response ){
	console.log( request.url );
	console.log( request.method );
	response.end( 'request is arrived.' );
} );

const port = 8080;
svr.listen( port, function(){
		console.log( 'Server is started.' );
} );

 HTTP サーバーを作成する方法には Express や Koa といったフレームワークを利用する方法もあります。

プロセス管理

 プロセスとは、プログラムをマルチタスクで処理するための実行処理の単位です。
 OSでは複数のプログラムが実行されます。実行されたプログラムはプロセスとして管理されます。
 プロセスは、待ち、停止、再実行、廃止といった管理によって複数が同時進行で処理されます

 Node.js におけるプロセス管理は OS のプロセスをプログラム上から管理するものです。

プロセスの停止

 Node.js からプロセスを停止するには以下のようなメソッドを実行します。

プロセスの停止
process.exit(1);

カレントディレクトリの設定と取得

 process によって Node.js のプログラムからカレントディレクトリを操作することができます。
 カレントディレクトリの取得は process.cwd() メソッドを使用します。カレントディレクトリの変更は process.chdir() メソッドを使用します。

カレントディレクトの取得
console.log( process.cwd() );

 カレントディレクトリの変更は以下のようにします。ディレクトリを Node.js のカレントディレクトリに合わせています。

カレントディレクトの変更と取得
process.chdir( __dirname );

// カレントディレクトリの取得
console.log( process.cwd() );

 Node.js については公式ドキュメントがあります。公式ドキュメントは https://nodejs.org/ja/docs から参照してください。