Node.js
Node.js はサーバーで実行することが想定された JavaScript です。
元はサーバーで実行することが想定されていましたが、現在はデスクトップアプリの開発やシステム用のスクリプトとしても利用されています。
スクリプト言語としては JavaScript ですが、Node.js ではファイル操作やネットワーク通信が使用できます。ただし、ブラウザで使用するような DOM がデフォルトでありません。
Node.js ではモジュールの追加という形で機能を充実させます。ブラウザ上で動く JavaScript とは特異なところがあります。
$ node example.js
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 が用意されています。
コアモジュール名 | 概要 |
---|---|
fs | ファイル操作 |
os | OS 関連のユーティリティ |
path | ファイルパスに関するユーティリティ |
http | HTTP に関連するユーティリティ |
https | HTTPS に関連するユーティリティ |
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 example.js
環境変数の取得
Node.js のプログラム上から OS の環境変数を取得するには process.env を使用します。
例えば以下のコードを実行するとすべての環境変数を取得することができます。
console.log( process.env );
引数の取得
node コマンドで .js ファイルを実行するときに引数を渡したいときがあります。
コマンドラインの引数を取得するには process.argv を使用します。
// 例えば 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 | 暗号化 |
dns | DNS(Domain Name System)関連 |
domain | ドメインごとの入出力操作に利用 |
events | 非同期に関するイベントのためのユーティリティ |
fs | ファイル操作 |
http | HTTP に関連するユーティリティ |
https | HTTPS に関連するユーティリティ |
net | ソケットベースのユーティリティ |
os | OS 関連のユーティリティ |
path | ファイルパスに関するユーティリティ |
punycode | ドメイン名の符号化に関するユーティリティ |
querystring | URL の解析、作成ユーティリティ |
readline | コマンドラインプログラムに関するユーティリティ |
smalloc | buffer 用メモリに関するユーティリティ |
stream | ストリームベースのユーティリティ |
string_decoder | 文字列への変換 |
tls | OpenSSL によるTLS/SSL通信関連 |
tty | TTY 関連 |
dgram | UDP(User Datagram Protocol) 関連 |
url | URL の解析 |
util | 各種ユーティリティ |
vm | バーチャルマシンで JavaScript 実行するためのユーティリティ |
zlib | zlib の圧縮・解凍 |
コアモジュールを読み込みには 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 コアモジュールをインクルードします。
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() メソッドを使用します。
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 といった対策が必要になります。。
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 を指定すれば実行するソースファイルの位置から辿ったファイル指定にすることができます。
上記の例のままでは実行ファイルを呼び出した位置からファイルを探すために必ずしも指定するファイルが見つかるとはいえません。このことを解消することができます。
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() メソッドを利用してファイル指定を作成したほうがプラットフォームに依存しない汎用性をもたせることができます。
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() メソッドを使用します。
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 を併用したほうがよいでしょう。
const fs = require( 'fs' ); const pth = require( 'path' ); try{ fs.writeFile( pth.join( __dirname, 'example.txt' ), 'ファイルの作成テスト\n' ); } catch( error ) { console.error( 'file write error.' ); }
ストリーム
ストリームとは、ファイルやネットワーク通信のポートを読み込み、書き込み、読み込みと書き込みの両方用に開いて連続的にデータを送受信する機能です。
以下はストリームによるファイルの読み込み例です。
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 を使って読み込んだ内容を書き込むこともできます。
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 の例を上げます。
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 から参照してください。