Node.js グローバルオブジェクト
JavaScript には特別なオブジェクトがあり、グローバルオブジェクト(Global Object)と呼ばれます。それとそのすべてのプロパティはプログラムのどこからでもアクセスできます。つまりグローバル変数です。
ブラウザの JavaScript では、通常 window がグローバルオブジェクトです。一方、Node.js のグローバルオブジェクトは global であり、すべてのグローバル変数(global 自身を除く)は global オブジェクトのプロパティです。
Node.js では、アプリケーションにそれを含めることなく、global のプロパティに直接アクセスできます。
グローバルオブジェクトとグローバル変数
global の最も基本的な役割は、グローバル変数のホストとなることです。ECMAScript の定義によれば、以下の条件を満たす変数はグローバル変数です。
- 最外部で定義された変数。
- グローバルオブジェクトのプロパティ。
- 暗黙的に定義された変数(定義せずに直接代入された変数)。
グローバル変数を定義すると、その変数は同時にグローバルオブジェクトのプロパティにもなります。逆も同様です。注意すべき点は、Node.js では最外部で変数を定義することはできません。すべてのユーザーコードは現在のモジュールに属しており、モジュール自体は最外部のコンテキストではないからです。
注意:var で変数を定義してグローバル変数を導入することは避けるべきです。グローバル変数は名前空間を汚染し、コードの結合リスクを高めるためです。
__filename
__filename現在実行中のスクリプトのファイル名を表します。ファイルの場所の絶対パスを出力しますが、コマンドライン引数で指定されたファイル名とは必ずしも同じではありません。モジュール内では、モジュールファイルのパスが返されます。
例
main.js ファイルを作成し、コードは次のとおりです。
// 输出全局变量 __filename 的值 console.log( __filename );
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js /web/com/サンプル/nodejs/main.js
__dirname
__dirname現在実行中のスクリプトがあるディレクトリを表します。
例
main.js ファイルを作成し、コードは次のとおりです。
// 输出全局变量 __dirname 的值 console.log( __dirname );
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js /web/com/サンプル/nodejs
setTimeout(cb, ms)
setTimeout(cb, ms)グローバル関数は、指定したミリ秒(ms)後に指定した関数(cb)を実行します。setTimeout() は指定した関数を一度だけ実行します。
タイマーを表すハンドル値を返します。
例
main.js ファイルを作成し、コードは次のとおりです。
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setTimeout(printHello, 2000);
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js Hello, World!
clearTimeout(t)
clearTimeout( t )グローバル関数は、以前に setTimeout() で作成したタイマーを停止するために使用します。パラメータtは setTimeout() 関数で作成したタイマーです。
例
main.js ファイルを作成し、コードは次のとおりです。
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);
// 清除定时器
clearTimeout(t);
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js
setInterval(cb, ms)
setInterval(cb, ms)グローバル関数は、指定したミリ秒(ms)後に指定した関数(cb)を実行します。
タイマーを表すハンドル値を返します。使用できるclearInterval(t)関数でタイマーをクリアできます。
setInterval() メソッドは、clearInterval() が呼び出されるかウィンドウが閉じられるまで、関数を繰り返し呼び出します。
例
main.js ファイルを作成し、コードは次のとおりです。
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setInterval(printHello, 2000);
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.jsHello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……
上記のプログラムは2秒ごとに "Hello, World!" を出力し、あなたがctrl + cボタンを押すまで永久に実行され続けます。
console
console はコンソール標準出力を提供するために使われます。それは Internet Explorer の JScript エンジンによって提供されたデバッグツールであり、後にブラウザの実装標準になりました。
Node.js はこの標準を踏襲し、慣習的な動作と一致する console オブジェクトを提供します。これは標準出力ストリーム(stdout)または標準エラーストリーム(stderr)に文字を出力するために使われます。
console メソッド
以下は console オブジェクトのメソッドです:
| 番号 | メソッド & 説明 |
|---|---|
| 1 | console.log([data][, ...]) 標準出力ストリームに文字を出力し、改行で終了します。このメソッドは複数のパラメータを受け取ります。パラメータが1つだけの場合は、そのパラメータの文字列形式を出力します。複数のパラメータがある場合は、C言語の printf() コマンドに似た形式で出力します。 |
| 2 | console.info([data][, ...]) このコマンドは情報メッセージを返すためのものです。このコマンドは console.log とほとんど違いませんが、Chrome ではテキストのみ出力されるのに対し、それ以外では青い感嘆符が表示されます。 |
| 3 | console.error([data][, ...]) エラーメッセージを出力します。コンソールではエラーが発生すると赤いバツ印が表示されます。 |
| 4 | console.warn([data][, ...]) 警告メッセージを出力します。コンソールには黄色い感嘆符が表示されます。 |
| 5 | console.dir(obj[, options]) オブジェクトを検査(inspect)し、読みやすく印刷しやすい形式で表示するために使われます。 |
| 6 | console.time(label) 時間を出力し、計測の開始を示します。 |
| 7 | console.timeEnd(label) 時間を終了し、計測の終了を示します。 |
| 8 | console.trace(message[, ...]) 現在実行中のコードのスタック内の呼び出しパスです。これはテスト関数の実行に非常に役立ちます。テストしたい関数の中に console.trace を追加するだけでよいです。 |
| 9 | console.assert(value[, message][, ...]) ある式や変数が真であるかどうかを判断するために使われます。2つのパラメータを受け取り、1つ目のパラメータは式、2つ目は文字列です。1つ目のパラメータが false のときだけ2つ目のパラメータを出力し、それ以外の場合は何も出力されません。 |
console.log は複数のパラメータを受け取ります。パラメータが1つだけの場合は、そのパラメータの文字列形式を出力します。複数のパラメータがある場合は、C言語の printf() コマンドに似た形式で出力します。
最初のパラメータは文字列です。パラメータがない場合は、改行だけを出力します。
console.log('Hello world');
console.log('byvoid%diovyb');
console.log('byvoid%diovyb', 1991);
実行結果は次のとおりです:
Hello world byvoid%diovyb byvoid1991iovyb
- console.error(): console.log() と同じ使い方ですが、標準エラーストリームに出力します。
- console.trace(): 現在の呼び出しスタックを標準エラーストリームに出力します。
console.trace();
実行結果は次のとおりです:
Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)
例
main.js ファイルを作成し、コードは次のとおりです。
console.info("程序开始执行:");
var counter = 10;
console.log("计数: %d", counter);
console.time("获取数据");
//
// 执行一些代码
//
console.timeEnd('获取数据');
console.info("程序执行完毕。")
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕
process
process はグローバル変数であり、global オブジェクトのプロパティです。
これは現在の Node.js プロセスの状態を表すオブジェクトで、オペレーティングシステムとの簡単なインターフェースを提供します。通常、ローカルのコマンドラインプログラムを書くときには、これと付き合うことは避けられません。以下では process オブジェクトの最も一般的なメンバーメソッドのいくつかを紹介します。
| 番号 | イベント & 説明 |
|---|---|
| 1 | exit プロセスが終了しようとするときに発生します。 |
| 2 | beforeExit node がイベントループを空にし、他に予定がないときにこのイベントが発生します。通常、プロセスの予定がないときに node は終了しますが、'beforeExit' のリスナーが非同期に呼び出されると、node は実行を続けます。 |
| 3 | uncaughtException 例外がイベントループにバブルして戻ってくると、このイベントが発生します。例外にリスナーを追加した場合、デフォルトの操作(スタックトレース情報を出力して終了する)は発生しません。 |
| 4 | シグナルイベント プロセスがシグナルを受信すると発生します。シグナルの一覧は標準の POSIX シグナル名を参照してください。例: SIGINT、SIGUSR1 など。 |
例
main.js ファイルを作成し、コードは次のとおりです。
process.on('exit', function(code) {
// 以下代码永远不会执行
setTimeout(function() {
console.log("该代码不会执行");
}, 0);
console.log('退出码为:', code);
});
console.log("程序执行结束");
main.js ファイルを実行すると、コードは次のとおりです。
$ node main.js 程序执行结束 退出码为: 0
終了ステータスコード
| ステータスコード | 名前 & 説明 |
|---|---|
| 1 | Uncaught Fatal Exception 未捕捉の例外があり、それがドメインまたは uncaughtException ハンドラによって処理されていません。 |
| 2 | Unused 予約済みです。Bash がビルトインの誤用のために予約しています。 |
| 3 | Internal JavaScript Parse Error JavaScript のソースコードが Node プロセスを起動するときに解析エラーが発生しました。非常にまれで、Node を開発するときにのみ発生します。 |
| 4 | Internal JavaScript Evaluation Failure JavaScript のソースコードが Node プロセスを起動し、評価時に関数の返却に失敗しました。非常にまれで、Node を開発するときにのみ発生します。 |
| 5 | Fatal Error V8 内の致命的で回復不能なエラーです。通常は stderr に次のように出力されます: FATAL ERROR |
| 6 | Non-function Internal Exception Handler 未捕捉の例外です。内部の例外処理関数が何らかの理由で on-function(関数ではない)に設定されており、呼び出すことができません。 |
| 7 | Internal Exception Handler Run-Time Failure 未捕捉の例外であり、例外処理関数が処理中に自ら例外をスローした場合。例えば、process.on('uncaughtException') または domain.on('error') が例外をスローした場合。 |
| 8 | Unused 予約済み。以前のバージョンの Node.js では、終了コード 8 が未捕捉の例外を意味することがありました。 |
| 9 | Invalid Argument 未知の引数が指定されたか、引数に値が指定されていない可能性があります。 |
| 10 | Internal JavaScript Run-Time Failure JavaScript のソースコードが Node プロセスを起動する際にエラーをスローした場合です。非常に稀で、Node の開発時のみ発生します。 |
| 12 | Invalid Debug Argument --debug や --debug-brk パラメータが設定されていますが、誤ったポートが選択されています。 |
| 128 | Signal Exits Node が SIGKILL や SIGHUP などの致命的なシグナルを受信した場合、終了コードは 128 にシグナルコードを加えたものになります。これは標準的な Unix の手法であり、終了シグナルコードは上位ビットに配置されます。 |
Process プロパティ
Process は、システムとの対話をより適切に制御するための多くの有用なプロパティを提供します:
| 番号. | プロパティ & 説明 |
|---|---|
| 1 | stdout 標準出力ストリーム。 |
| 2 | stderr 標準エラーストリーム。 |
| 3 | stdin 標準入力ストリーム。 |
| 4 | argv argv プロパティは、コマンドラインでスクリプトを実行する際の各引数からなる配列を返します。最初の要素は常に node、2番目の要素はスクリプトファイル名、残りの要素はスクリプトファイルの引数です。 |
| 5 | execPath 現在のスクリプトを実行している Node バイナリファイルの絶対パスを返します。 |
| 6 | execArgv コマンドラインでスクリプトを実行する際に、Node 実行ファイルとスクリプトファイルの間にあるコマンドライン引数を要素とする配列を返します。 |
| 7 | env 現在のシェルの環境変数をメンバーとするオブジェクトを返します。 |
| 8 | exitCode プロセス終了時のコード。プロセスが process.exit() で終了した場合、終了コードを指定する必要はありません。 |
| 9 | version Node のバージョン。例: v0.10.18。 |
| 10 | versions node のバージョンと依存関係を含むプロパティ。 |
| 11 | config 現在の node 実行ファイルをコンパイルするために使用される JavaScript 設定オプションを含むオブジェクト。これは ./configure スクリプトを実行して生成される "config.gypi" ファイルと同じものです。 |
| 12 | pid 現在のプロセスのプロセスID。 |
| 13 | title プロセス名。デフォルト値は "node" で、この値をカスタマイズできます。 |
| 14 | arch 現在の CPU のアーキテクチャ: 'arm'、'ia32'、'x64'。 |
| 15 | platform プログラムが実行されているプラットフォームシステム: 'darwin'、'freebsd'、'linux'、'sunos'、'win32'。 |
| 16 | mainModule require.main の代替メソッド。違いは、メインモジュールが実行時に変更された場合、require.main は古いモジュールを返し続ける可能性があることです。これらは同じモジュールを参照していると考えることができます。 |
例
ファイル main.js を作成し、コードは次の通りです:
// 输出到终端
process.stdout.write("Hello World!" + "\n");
// 通过参数读取
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// 获取执行路径
console.log(process.execPath);
// 平台信息
console.log(process.platform);
main.js ファイルを実行するコードは次の通りです:
$ node main.js Hello World! 0: node 1: /web/www/node/main.js /usr/local/node/0.10.36/bin/node darwin
メソッドリファレンス
Process は、システムとの対話をより適切に制御するための多くの有用なメソッドを提供します:
| 番号 | メソッド & 説明 |
|---|---|
| 1 | abort() これにより node が abort イベントをトリガーします。node は終了し、コアファイルを生成します。 |
| 2 | chdir(directory) 現在のプロセスの作業ディレクトリを変更します。操作が失敗した場合は例外をスローします。 |
| 3 | cwd() 現在のプロセスの作業ディレクトリを返します。 |
| 4 | exit([code]) 指定された code でプロセスを終了します。省略した場合は code 0 が使用されます。 |
| 5 | getgid() プロセスのグループIDを取得します(getgid(2) を参照)。取得されるのはグループの数値IDであり、名前ではありません。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 6 | setgid(id) プロセスのグループIDを設定します(setgid(2) を参照)。数値IDまたはグループ名を受け取ります。グループ名を指定した場合、数値IDに解決されるまでブロックされます。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 7 | getuid() プロセスのユーザーIDを取得します(getuid(2) を参照)。これは数値のユーザーIDであり、ユーザー名ではありません。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 8 | setuid(id) プロセスのユーザーIDを設定します(setuid(2) を参照)。数値IDまたは文字列の名前を受け取ります。ユーザー名を指定した場合、数値IDに解決されるまでブロックされます。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 9 | getgroups() プロセスのグループID配列を返します。POSIX システムでは必ず存在する保証はありませんが、node.js では保証されています。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 10 | setgroups(groups) プロセスのグループIDを設定します。これは認可操作であるため、root 権限または CAP_SETGID ケーパビリティが必要です。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 11 | initgroups(user, extra_group) /etc/group を読み取り、メンバーが所属するすべてのグループを使用してグループアクセスリストを初期化します。これは認可操作であるため、root 権限または CAP_SETGID ケーパビリティが必要です。 注意: この関数は POSIX プラットフォームでのみ利用可能です(例: Windows と Android 以外)。 |
| 12 | kill(pid[, signal]) プロセスにシグナルを送信します。pid はプロセスID、signal は送信するシグナルの文字列表現です。シグナル名は文字列であり、例えば 'SIGINT' や 'SIGHUP' です。省略した場合、シグナルは 'SIGTERM' になります。 |
| 13 | memoryUsage() Node プロセスが使用しているメモリの状態を記述するオブジェクトを返します。単位はバイトです。 |
| 14 | nextTick(callback) 現在のイベントループが終了したら、コールバック関数を呼び出します。 |
| 15 | umask([mask]) プロセスのファイルマスクを設定または読み取ります。子プロセスは親プロセスからマスクを継承します。mask パラメータが有効な場合は古いマスクを返し、そうでない場合は現在のマスクを返します。 |
| 16 | uptime() Node が稼働している秒数を返します。 |
| 17 | hrtime() 現在のプロセスの高解像度時間を [seconds, nanoseconds] 配列の形式で返します。これは過去の任意のイベントを基準としています。この値は日付とは無関係であり、クロックドリフトの影響を受けません。主な用途は、正確な時間間隔によってプログラムのパフォーマンスを測定することです。 以前の結果を現在の process.hrtime() に渡すと、2つの間の時間差が返され、ベンチマークや時間間隔の測定に使用できます。 |
例
ファイル main.js を作成し、コードは次の通りです:
// 输出当前目录
console.log('当前目录: ' + process.cwd());
// 输出当前版本
console.log('当前版本: ' + process.version);
// 输出内存使用情况
console.log(process.memoryUsage());
main.js ファイルを実行するコードは次の通りです:
$ node main.js
当前目录: /web/com/サンプル/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 } その他の拡張