前回、consoleは"Consoleクラスのグローバルインスタンス"と言っていたけど、いろいろ調べていくと、consoleは"consoleモジュールのグローバルインスタンス"のほうが正しいのかなあっておもった・・・。
前回は、"consoleモジュールのグローバルインスタンス"について扱ったが、今回は"consoleモジュールのコンストラクタConsole"について扱う。
Console | Node.js v11.10.1 Documentation
コンストラクタに引数として、出力ストリームや、入力ストリーム、エラー出力ストリームを渡すことで、ファイルにログ出力などができる。
で、前回のグローバルインスタンス、今回のConsoleコンストラクタ含めて、いろいろな呼び出し方ができることがわかった。
まず、
前回のようなグローバルインスタンスで標準出力。
$ vi console1.js $ node console1.js AAA $
こうなってました。
次に、
requireでconsoleモジュールの参照を取得し、varでcustomConsoleという変数に格納し、customConsole.logで出力。
$ vi console2.js $ node console2.js BBB $
変わらない。
続いて、
customConsoleが、varによる変数から、constによる定数になっている。
$ vi console3.js $ node console3.js CCC $
これも変わらない。
さて、ここから、
requireでconsoleモジュールの参照が取得できるわけだが、
constの次の"{Console}"、これは『分割代入』というJavaScriptの機能で、"その名前の要素を、その名前の変数に代入する"というもの。
consoleモジュールの中にはConsoleコンストラクタの参照があり、これをconstのConsoleに格納しているのである。
ここはfsモジュールで"output.log"への書き込みストリームを作成している。
('fs'モジュールについては後日・・・。)
Consoleコンストラクタの前にnewを付けて、オブジェクトを作成。このとき、outputStreamを渡すことで、outputStreamへの書き込みになる。
あとはlogで"DDD"を出力。
$ vi console4.js $ node console4.js $ ls console1.js console2.js console3.js console4.js output.log $ cat output.log DDD $
このように標準出力ではなく、"output.log"に"DDD"と書き込まれている。
さて、Consoleコンストラクタは、require('console')モジュールのConsole関数であるとも言える。
なので、それにnewを付けてオブジェクト生成をし、customConsoleに格納もできる。
$ ls console1.js console2.js console3.js console4.js console5.js output.log $ vi console5.js $ node -v v10.15.0 $ node console5.js /home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5 customConsole.log("EEE"); // customConsole.logで'output2.log'に"EEE"を出力. ^ TypeError: Cannot read property 'log' of undefined at Object.<anonymous> (/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5:15) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3) $ ls console1.js console2.js console3.js console4.js console5.js output.log output2.log $ cat output2.log $
ただし、これをv10.15.0でやったら、エラーが出てしまう。
$ sudo n 11.10.0 [sudo] bg1 のパスワード: $ node -v v11.10.0 $ ls console1.js console2.js console3.js console4.js console5.js output.log output2.log $ rm output2.log $ ls console1.js console2.js console3.js console4.js console5.js output.log $ node console5.js $ cat output2.log EEE $
そこで、nでv11.10.0に切り替えて、再度実行してみたら、今度は成功した。
(v10系のバグだろうか・・・。LTSなのに・・・。)
グローバルインスタンスのconsoleもrequire('console')と参照してるものは同じなので、
こういう風にもできる。
$ node -v v10.15.0 $ vi console6.js $ node console6.js $ ls console1.js console2.js console3.js console4.js console5.js console6.js output.log output2.log output3.log $ cat output3.log FFF $
これはv10.15.0でも成功する。
Consoleは関数だから、別にnewで生成しなくても、require('console')の参照から関数として呼び出せる。(結局、newはいらない。)
$ ls console1.js console2.js console3.js console4.js console5.js console6.js console7.js output.log output2.log output3.log $ vi console7.js $ node -v v10.15.0 $ node console7.js /home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5 customConsole.log("GGG"); // customConsole.logで'output4.log'に"GGG"を出力. ^ TypeError: Cannot read property 'log' of undefined at Object.<anonymous> (/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5:15) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3) $ ls console1.js console2.js console3.js console4.js console5.js console6.js console7.js output.log output2.log output3.log output4.log $ cat output4.log $ rm output4.log $ sudo n 11.10.0 [sudo] bg1 のパスワード: $ node -v v11.10.0 $ node console7.js $ ls console1.js console2.js console3.js console4.js console5.js console6.js console7.js output.log output2.log output3.log output4.log $ cat output4.log GGG $
これも、v10.15.0で失敗するが、v11.10.0だと成功。
グローバルインスタンスからの呼び出しも、
$ ls console1.js console2.js console3.js console4.js console5.js console6.js console7.js console8.js output.log output2.log output3.log output4.log $ vi console8.js $ node console8.js /home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5 customConsole.log("HHH"); // customConsole.logで'output5.log'に"HHH"を出力. ^ TypeError: Cannot read property 'log' of undefined at Object.<anonymous> (/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5:15) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3) $ ls console1.js console2.js console3.js console4.js console5.js console6.js console7.js console8.js output.log output2.log output3.log output4.log output5.log $ cat output5.log $ rm output5.log $ sudo n 11.10.0 $ node -v v11.10.0 $ node console8.js $ cat output5.log HHH $
これも、v10.15.0で失敗するが、v11.10.0だと成功。
とにかく、今回の一件で、いろんな呼び出し方があるということを知り、JavaScriptにはクラスなんて概念なんてないことを思い知らされ、バージョンによって出来たり出来なかったりなどなど、いろんなことを学んだ・・・。
Sample/nodejs/Console/Console/src/Console at master · bg1bgst333/Sample · GitHub