- 投稿日:2019-11-01T23:32:06+09:00
入門者のためのNode.js関連用語の意味と体系化
公式ドキュメントやQiitaの解説は入門者には意味不明だったので、翻訳するための知識が必要と思ってここにまとめておく。執筆者が勉強中により内容が頻繁に書き換えられます。
個人的勉強中の関連記事
管理システム
Git
npm
nvm
yarn(勉強予定)
Homebrew(勉強予定)データ定義
JSON(勉強予定)
YAML(勉強予定)
XML(勉強予定)フレームワーク
Node.js
React.js
Next.js
Nuxt.js(勉強予定)
Express.js(勉強予定)
jQuery(勉強予定)
Vue.js(勉強予定)WEBサーバー
Apache(勉強予定)データベース
SQL(勉強予定)
mongoDB(勉強予定)
Rails(勉強予定)基礎知識がないと記憶が定着しない
まず、こんな記事をまとめる必要性を感じたキッカケについて。知識も経験を触りだけの初心者なりに公式チュートリアルを読みながら自分のサイトをNext.jsで再構築してみようと試みたところ、ある程度まではチュートリアルに言われた通りにやることは可能だったが、次第に「そのコードを書く意味は何?」という疑問が1ステップに1つついてくるようになり、疑問が山積みになったあたりで知識体系が完全崩壊し、学んできたことが記憶に定着しないという事態に陥った。つまり知識が蓄積されず仕舞いに終わったと言うことで、それならば今学習していることの知識が定着しないのであれば、さらにその下層の知識体系から構築する必要があると考えた。よって、Next.jsの前にNode.js、Node.jsの前にWEBアプリのアーキテクチャなどの基礎知識、というように疑問にぶち当たるたびに下層知識に学習をシフトしていった結果、とりあえず用語の意味の理解と体系化が必要だという結論に至った。
以下は、上記の参考文献を初心者なりに再解釈して書き直した感じの内容となっている。
システムコール
プログラミング言語にはファイルを扱う機能がある。ファイル管理はOSの仕事なので、プログラムでファイルを扱う際にはOSに処理を渡す必要がある。この流れをシステムコールという。システムコールはOSによって異なるが、POSIXに準拠したOSにおいてはファイルディスクリプタによってファイルにアクセスする基本的なシステムコールが用意されている。
-open:ファイルを開く
-read:ファイルから読み込む
-write:ファイルに書き込む
-close:ファイルを閉じるPOSIX
Porable Operationing System Interfaceの略で、UNIXの標準規格のファイル管理システム。
同期・非同期
同期処理では、呼び出し側が処理を呼び出すと処理が終わるまで返ってこない。例えば、ファイル読み込みであればファイルの内容を読み取るまで返ってこない。
非同期処理では、処理を呼び出したら処理が終わる前に返ってくる。通常のファイル読み込みでは読み込み結果を格納するメモリ領域を渡すが、非同期の場合は呼び出し直後に結果を参照しても値が入っている保証はない。
非同期処理のメリットは、スループットの向上にある。スループットは一定時間単位で処理できる量の評価基準。同期処理では一つの処理が完了するまでメモリ要領を占有するため先着順の処理がメモリを埋め尽くして他の処理ができなくなるが、非同期処理ではCPUが処理を呼び出しはするがメモリは開け渡さずDMAを利用するためCPUが他の処理に着手することができる。その結果、CPUは先着順のタスクにメモリを占有されることなく、より多くのタスクに着手することができ、スループットの向上につながる。
用語 意味 RAM Ramdom Access Memoryの略で、自由なアクセス可能な主記憶装置のこと。CPUが処理を行う際の作業台のようなメモリでなので頻繁にデータが書き換えられ、電源が切れると作業に使用していた一時データも消去される。 ROM Read Only Memoryの略で、書き込み不可・読み出し専用、または単に内蔵ストレージおよび外付けストレージを指す補助記憶装置のこと。 CPU Central Processing Unitの略で、記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで解釈・実行することでじょうほうの加工を行う中央処理装置。 I/O CPUや主記憶装置などの機器やシステムに外部からデータや信号を入力したり、外部に出力するための回路、装置、ソフトウェアのこと。入力装置としてはキーボード、マウス、タッチパネルなど、出力装置としてはディスプレイ、スピーカー、モーターなどがある。 DMA Direct Memory Accessの略で、CPUを介さないデータ転送を実現する設計思想のこと。本来ならCPUが処理するデータ転送を引き受けることで、CPUは他のタスクに要領を割くことができる。 参考文献
DMAのメリットって何?(2/3)ブロッキング・ノンブロッキング
Node.jsではノンブロッキングI/Oと呼ばれ、
用語 意味 ブロッキング 先着のIO処理が完了するまで待ち時間が発生する性質 ノンブロッキング IO処理に待ち時間が発生すると関数から返る性質。
簡単に言えば、処理が止まらない性質。
処理が止まりそうな場合はエラーを返してプログラムが完結しないように回避することで処理し続けることができる。同期 IO処理が終わるまでブロックする性質 非同期 IO処理を別スレッドに渡す性質。
ノンブロッキングによって実現できる処理の仕方。
ある関数が呼び出されたとき、戻り値として本来渡したい結果は返さず、関数を終了させて呼び出し元に戻し、後で本来渡したかった値を返せる状態になったときにその値を通知する仕組み。
比較 類似性 同期とブロッキング ほぼ同じ 非同期とノンブロッキング ソケット
用語 意味 socket bind listen accept Node.jsの非同期処理
非同期処理ではIO処理の待ち時間ができないようにするが、必要としているのはIO処理の結果。別の処理をしつつ、結果が出たらそれを受け取ると言う処理はどうやっているか。正しい順序で処理が行われるようにしなくてはならない。
よそに依頼した処理がいつ終わるかは不明。処理完了は依頼された側しか分からないため、依頼した側に通知する仕組みが必要。
Promise
非同期処理を実現するためのオブジェクト
- 関数の結果としてreturnできる
- メソッドを持っている
- 変数に格納できる
async/await
Promise のシンタックスシュガー
UML
UMLとは「Unified Modeling Language」の略で「統一モデリング言語」の意。分析、設計、実装のオブジェクト指向開発に用いられるモデリング手法。
UML図とは、ソフトウェアシステムの成果物を記述、視覚化、構築、文書化するために使用される国際的な業界標準のグラフィカル表記法。
参考文献
初心者が押さえておくべきのUML入門知識
- 投稿日:2019-11-01T23:32:06+09:00
入門者のためのNode.js関連用語の意味と体系化 (注意:間違い多し)
公式ドキュメントやQiitaの解説は入門者には意味不明だったので、翻訳するための知識が必要と思ってここにまとめておく。執筆者が勉強中により内容が頻繁に書き換えられます。
勉強中の関連記事 ~擬似知識体系~
管理システム
Git
npm
nvm
yarn(勉強予定)
Homebrew(勉強予定)言語
JavaScriptデータ定義
JSON(勉強予定)
YAML(勉強予定)
XML(勉強予定)フレームワーク
Node.js
React.js
Next.js
Nuxt.js(勉強予定)
Express.js
jQuery(勉強予定)
Vue.js(勉強予定)WEBサーバー
Apache(勉強予定)データベース
SQL
mongoDB
Mongoose(勉強予定)
Rails(勉強予定)
SSL(勉強予定)まとめ
入門者のためのNode.js関連用語の意味と体系化
Node.js勉強中に出会ったJavaScriptコードたち解読
プログラミング入門者がWEBアプリ制作を勉強する順序の観察記録【個人的趣味】基礎知識がないと記憶が定着しない
まず、こんな記事をまとめる必要性を感じたキッカケについて。知識も経験を触りだけの初心者なりに公式チュートリアルを読みながら自分のサイトをNext.jsで再構築してみようと試みたところ、ある程度まではチュートリアルに言われた通りにやることは可能だったが、次第に「そのコードを書く意味は何?」という疑問が1ステップに1つついてくるようになり、疑問が山積みになったあたりで知識体系が完全崩壊し、学んできたことが記憶に定着しないという事態に陥った。つまり知識が蓄積されず仕舞いに終わったと言うことで、それならば今学習していることの知識が定着しないのであれば、さらにその下層の知識体系から構築する必要があると考えた。よって、Next.jsの前にNode.js、Node.jsの前にWEBアプリのアーキテクチャなどの基礎知識、というように疑問にぶち当たるたびに下層知識に学習をシフトしていった結果、とりあえず用語の意味の理解と体系化が必要だという結論に至った。
以下は、上記の参考文献を初心者なりに再解釈して書き直した感じの内容となっている。
システムコール
プログラミング言語にはファイルを扱う機能がある。ファイル管理はOSの仕事なので、プログラムでファイルを扱う際にはOSに処理を渡す必要がある。この流れをシステムコールという。システムコールはOSによって異なるが、POSIXに準拠したOSにおいてはファイルディスクリプタによってファイルにアクセスする基本的なシステムコールが用意されている。
-open:ファイルを開く
-read:ファイルから読み込む
-write:ファイルに書き込む
-close:ファイルを閉じるPOSIX
Porable Operationing System Interfaceの略で、UNIXの標準規格のファイル管理システム。
同期・非同期
同期処理では、呼び出し側が処理を呼び出すと処理が終わるまで返ってこない。例えば、ファイル読み込みであればファイルの内容を読み取るまで返ってこない。
非同期処理では、処理を呼び出したら処理が終わる前に返ってくる。通常のファイル読み込みでは読み込み結果を格納するメモリ領域を渡すが、非同期の場合は呼び出し直後に結果を参照しても値が入っている保証はない。
非同期処理のメリットは、スループットの向上にある。スループットは一定時間単位で処理できる量の評価基準。同期処理では一つの処理が完了するまで次の処理に着手しない。一方、非同期処理ではCPUが処理を呼び出しはするが実際の処理にはDMAを利用するためCPUが他の処理に着手することができる。その結果、長時間かかる処理と並行して小さな処理も行えるためより多くのタスクに着手することができ、スループットの向上につながる。
用語 意味 RAM Ramdom Access Memoryの略で、自由なアクセス可能な主記憶装置のこと。CPUが処理を行う際の作業台のようなメモリでなので頻繁にデータが書き換えられ、電源が切れると作業に使用していた一時データも消去される。 ROM Read Only Memoryの略で、書き込み不可・読み出し専用、または単に内蔵ストレージおよび外付けストレージを指す補助記憶装置のこと。 CPU Central Processing Unitの略で、記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで解釈・実行することでじょうほうの加工を行う中央処理装置。 I/O CPUや主記憶装置などの機器やシステムに外部からデータや信号を入力したり、外部に出力するための回路、装置、ソフトウェアのこと。入力装置としてはキーボード、マウス、タッチパネルなど、出力装置としてはディスプレイ、スピーカー、モーターなどがある。 DMA Direct Memory Accessの略で、CPUを介さないデータ転送を実現する設計思想のこと。本来ならCPUが処理するデータ転送を引き受けることで、CPUは他のタスクに着手することができる。 参考文献
DMAのメリットって何?(2/3)ブロッキング・ノンブロッキング
Node.jsではノンブロッキングI/Oと呼ばれ、
用語 意味 ブロッキング 先着のIO処理が完了するまで待ち時間が発生する性質 ノンブロッキング IO処理に待ち時間が発生すると関数から返る性質。
簡単に言えば、処理が止まらない性質。
処理が止まりそうな場合はエラーを返してプログラムが完結しないように回避することで処理し続けることができる。同期 IO処理が終わるまでブロックする性質 非同期 IO処理を別スレッドに渡す性質。
ノンブロッキングによって実現できる処理の仕方。
ある関数が呼び出されたとき、戻り値として本来渡したい結果は返さず、関数を終了させて呼び出し元に戻し、後で本来渡したかった値を返せる状態になったときにその値を通知する仕組み。
比較 類似性 同期とブロッキング ほぼ同じ 非同期とノンブロッキング ソケット
用語 意味 socket bind listen accept Node.jsの非同期処理
非同期処理ではIO処理の待ち時間ができないようにするが、必要としているのはIO処理の結果。別の処理をしつつ、結果が出たらそれを受け取ると言う処理はどうやっているか。正しい順序で処理が行われるようにしなくてはならない。
よそに依頼した処理がいつ終わるかは不明。処理完了は依頼された側しか分からないため、依頼した側に通知する仕組みが必要。
Promise
非同期処理を実現するためのオブジェクト
- 関数の結果としてreturnできる
- メソッドを持っている
- 変数に格納できる
async/await
Promise のシンタックスシュガー
UML
UMLとは「Unified Modeling Language」の略で「統一モデリング言語」の意。分析、設計、実装のオブジェクト指向開発に用いられるモデリング手法。
UML図とは、ソフトウェアシステムの成果物を記述、視覚化、構築、文書化するために使用される国際的な業界標準のグラフィカル表記法。
参考文献
初心者が押さえておくべきのUML入門知識
- 投稿日:2019-11-01T23:32:06+09:00
入門者のためのNode.js関連用語の意味と体系化(注意:間違い多し)
公式ドキュメントやQiitaの解説は入門者には意味不明だったので、翻訳するための知識が必要と思ってここにまとめておく。執筆者が勉強中により内容が頻繁に書き換えられます。
個人的勉強中の関連記事
管理システム
Git
npm
nvm
yarn(勉強予定)
Homebrew(勉強予定)データ定義
JSON(勉強予定)
YAML(勉強予定)
XML(勉強予定)フレームワーク
Node.js
React.js
Next.js
Nuxt.js(勉強予定)
Express.js(勉強予定)
jQuery(勉強予定)
Vue.js(勉強予定)WEBサーバー
Apache(勉強予定)データベース
SQL(勉強予定)
mongoDB(勉強予定)
Rails(勉強予定)
SSL(勉強予定)基礎知識がないと記憶が定着しない
まず、こんな記事をまとめる必要性を感じたキッカケについて。知識も経験を触りだけの初心者なりに公式チュートリアルを読みながら自分のサイトをNext.jsで再構築してみようと試みたところ、ある程度まではチュートリアルに言われた通りにやることは可能だったが、次第に「そのコードを書く意味は何?」という疑問が1ステップに1つついてくるようになり、疑問が山積みになったあたりで知識体系が完全崩壊し、学んできたことが記憶に定着しないという事態に陥った。つまり知識が蓄積されず仕舞いに終わったと言うことで、それならば今学習していることの知識が定着しないのであれば、さらにその下層の知識体系から構築する必要があると考えた。よって、Next.jsの前にNode.js、Node.jsの前にWEBアプリのアーキテクチャなどの基礎知識、というように疑問にぶち当たるたびに下層知識に学習をシフトしていった結果、とりあえず用語の意味の理解と体系化が必要だという結論に至った。
以下は、上記の参考文献を初心者なりに再解釈して書き直した感じの内容となっている。
システムコール
プログラミング言語にはファイルを扱う機能がある。ファイル管理はOSの仕事なので、プログラムでファイルを扱う際にはOSに処理を渡す必要がある。この流れをシステムコールという。システムコールはOSによって異なるが、POSIXに準拠したOSにおいてはファイルディスクリプタによってファイルにアクセスする基本的なシステムコールが用意されている。
-open:ファイルを開く
-read:ファイルから読み込む
-write:ファイルに書き込む
-close:ファイルを閉じるPOSIX
Porable Operationing System Interfaceの略で、UNIXの標準規格のファイル管理システム。
同期・非同期
同期処理では、呼び出し側が処理を呼び出すと処理が終わるまで返ってこない。例えば、ファイル読み込みであればファイルの内容を読み取るまで返ってこない。
非同期処理では、処理を呼び出したら処理が終わる前に返ってくる。通常のファイル読み込みでは読み込み結果を格納するメモリ領域を渡すが、非同期の場合は呼び出し直後に結果を参照しても値が入っている保証はない。
非同期処理のメリットは、スループットの向上にある。スループットは一定時間単位で処理できる量の評価基準。同期処理では一つの処理が完了するまで次の処理に着手しない。一方、非同期処理ではCPUが処理を呼び出しはするが実際の処理にはDMAを利用するためCPUが他の処理に着手することができる。その結果、長時間かかる処理と並行して小さな処理も行えるためより多くのタスクに着手することができ、スループットの向上につながる。
用語 意味 RAM Ramdom Access Memoryの略で、自由なアクセス可能な主記憶装置のこと。CPUが処理を行う際の作業台のようなメモリでなので頻繁にデータが書き換えられ、電源が切れると作業に使用していた一時データも消去される。 ROM Read Only Memoryの略で、書き込み不可・読み出し専用、または単に内蔵ストレージおよび外付けストレージを指す補助記憶装置のこと。 CPU Central Processing Unitの略で、記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで解釈・実行することでじょうほうの加工を行う中央処理装置。 I/O CPUや主記憶装置などの機器やシステムに外部からデータや信号を入力したり、外部に出力するための回路、装置、ソフトウェアのこと。入力装置としてはキーボード、マウス、タッチパネルなど、出力装置としてはディスプレイ、スピーカー、モーターなどがある。 DMA Direct Memory Accessの略で、CPUを介さないデータ転送を実現する設計思想のこと。本来ならCPUが処理するデータ転送を引き受けることで、CPUは他のタスクに着手することができる。 参考文献
DMAのメリットって何?(2/3)ブロッキング・ノンブロッキング
Node.jsではノンブロッキングI/Oと呼ばれ、
用語 意味 ブロッキング 先着のIO処理が完了するまで待ち時間が発生する性質 ノンブロッキング IO処理に待ち時間が発生すると関数から返る性質。
簡単に言えば、処理が止まらない性質。
処理が止まりそうな場合はエラーを返してプログラムが完結しないように回避することで処理し続けることができる。同期 IO処理が終わるまでブロックする性質 非同期 IO処理を別スレッドに渡す性質。
ノンブロッキングによって実現できる処理の仕方。
ある関数が呼び出されたとき、戻り値として本来渡したい結果は返さず、関数を終了させて呼び出し元に戻し、後で本来渡したかった値を返せる状態になったときにその値を通知する仕組み。
比較 類似性 同期とブロッキング ほぼ同じ 非同期とノンブロッキング ソケット
用語 意味 socket bind listen accept Node.jsの非同期処理
非同期処理ではIO処理の待ち時間ができないようにするが、必要としているのはIO処理の結果。別の処理をしつつ、結果が出たらそれを受け取ると言う処理はどうやっているか。正しい順序で処理が行われるようにしなくてはならない。
よそに依頼した処理がいつ終わるかは不明。処理完了は依頼された側しか分からないため、依頼した側に通知する仕組みが必要。
Promise
非同期処理を実現するためのオブジェクト
- 関数の結果としてreturnできる
- メソッドを持っている
- 変数に格納できる
async/await
Promise のシンタックスシュガー
UML
UMLとは「Unified Modeling Language」の略で「統一モデリング言語」の意。分析、設計、実装のオブジェクト指向開発に用いられるモデリング手法。
UML図とは、ソフトウェアシステムの成果物を記述、視覚化、構築、文書化するために使用される国際的な業界標準のグラフィカル表記法。
参考文献
初心者が押さえておくべきのUML入門知識
- 投稿日:2019-11-01T20:03:30+09:00
Node.jsのパッケージマネージャの使い方(yarn)
免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。
環境
OS:最新版ではないMacOS
VirtualBox:5.2.26
Vagrant:2.2.6
Ubuntu:ubuntu/bionic64 v20181129.0.0目次
- yarnとは
- yarnでパッケージのインストール
- yarnでパッケージを作ってみる
1. yarnとは
yarnとはNode.jsで使うパッケージを管理するものですが、
この説明をする前にパッケージについて説明します。パッケージ
パッケージはライブラリを包むもの。
パッケージマネージャはライブラリを包み、管理するものです。ライブラリ
ライブラリは先人が作った処理です。
汎用的な処理を実装する際に使います。
例えば、「複数の値の中で一番大きい数字がどれか判定したい!」という時があったとします。ただ、この処理を1から作るのは、簡単そうにありません。
そこで、ライブラリを使います。
Javascriptには標準で、Math.max() という()内に引数として与えた数字の中で、一番大きい数字を返す「標準ビルトインオブジェクトMathのmaxメソッド」がライブラリとして標準で備わっています。Math.max(2, 3, 1); // expected output: 3標準ビルトインオブジェクト...JavaScriptが標準で提供しているオブジェクト(ex: MathやDateなど)、ライブラリとして提供されています。
Node.jsドキュメント...Node.jsがバージョンごとに標準で、ライブラリを提供しています。続いて、yarnについて説明していきます。
Node.jsが標準で備えているパッケージ管理ツールは npm(エヌピーエム)と呼ばれるものです。
npm公式サイトには誰かが作ったライブラリが公開されており、自由に利用することができます。$ npm install パッケージ名でパッケージをインストールすることができます。
2. yarnでパッケージのインストール
しかし、npmをさらに使いやすくしたパッケージ管理ツールyarnが誕生しました。
使い方としては、npmとほとんど一緒で、$ yarn add パッケージ名とします。
yarn addでパッケージをインストールすると、インストールを実行したディレクトリの中にあるnode_modulesというディレクトリに、パッケージがインストールされます。node_modules ディレクトリにインストールされたnpmパッケージは、自動的に読み込まれ、そのディレクトリ内で以下のように利用することができます。
const 変数 = require('パッケージ名');パッケージをrequire関数で取得することで、利用できるようになります。
3. yarnでパッケージを作ってみる
yarn(npm)では他人のパッケージを利用するだけでなく、自分でパッケージを作成しすることもできます。
$ mkdir パッケージ名のディレクトリ $ cd パッケージ名のディレクトリ $ yarn inityarn initと入力すると、パッケージの設定画面がでてきます。
//パッケージ名を入力します。 name: (パッケージ名) //バージョンの設定します。 version: (1.0.0) //パッケージの説明を入力します。 description: //ライブラリとして読み込まれるJavaScriptファイルを設定します。 entry point: (index.js) //Gitリポジトリを公開する場合のURLを入力します。 repository url: //npmに登録する際の著者の名前を設定します。 author: //ライセンス名を入力します。 license: (MIT) //公開の可否を入力します。 private:パッケージの設定が成功すると以下のように表示されます。
success Saved package.json Done in 9.20s.では、ライブラリとして読み込まれるJavaScriptファイルを作成し、パッケージを作っていきます。
モジュールは関数型とオブジェクト型のどちらでも定義できます。モジュールを関数型で定義
index.js'use strict'; module.exports = add(a, b) { return a + b; };としても、
モジュールをオブジェクト型で定義
index.jsfunction add(a, b) { return a + b; } module.exports = { add : add };OR
index.jsmodule.exports = { add : (a, b) => { return a + b; } };でも、パッケージとして使うことができます。
使用先のファイルでは、以下のように使います。
関数型で定義されたモジュールのパッケージを使うには
app.jsconst add = require(パス or パッケージ名); const result = add(1, 2); console.log(result); // expected output: 3オブジェクト型で定義されたモジュールのパッケージを使うには
app.jsconst 変数 = require(パス or パッケージ名); const result = 変数.add(1, 2); console.log(result); // expected output: 3requireの引数には、パッケージがnpm公式サイトに公開されていたらパッケージ名を指定し、
自分のPC上にあるならパスを指定します。参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「[NodeJS] モジュール定義について学ぶ」
https://www.yoheim.net/blog.php?q=20150101
- 投稿日:2019-11-01T18:39:39+09:00
nodenvでinstall出来るnodeのバージョンを確認したら最新が出てこなかった時
nodenvでnodeのバージョンを管理していてnodeのバージョンを変える必要がある時
node 9.11.2 を node 12.12.0にしたいなど
【インストール出来るnodeの一覧を表示】 nodenv install -l【結果】 〜 12.12.0 chakracore-dev chakracore-nightly 〜12.12.0がない
このようにnodeのバージョンが表示されない時は「node-build」が古いからだと思われ、ここにどうすればいいのか書いてあります
https://github.com/nodenv/node-buildUpgrading # Via Homebrew $ brew update && brew upgrade node-build # As a nodenv plugin $ cd "$(nodenv root)"/plugins/node-build && git pullnodenvのプラグインとして使用しているのでcdを使ってnode-buildの階層まで移動
そしてgit pullするといいらしいです
その後もう一度
【インストール出来るnodeの一覧を表示】 nodenv install -l【結果】 〜 12.10.0 12.11.0 12.11.1 12.12.0 〜をするとinstall出来るnodeのリストが更新されていると思うので、
node install 12.12.0で入れたいバージョンをinstall出来るようになっています
- 投稿日:2019-11-01T09:13:32+09:00
Node.jsでログにUser IDを自動出力
背景
ECサイトなどを運用する場合、ログにユーザの識別IDが付与されていると調査時に行動を把握することが容易なため便利です。
そこで今回はNode.js(Express)で実現してみたいとおもいます。実装
userId保持用の箱を準備
ログを出力する際、userIdを参照できるようにシングルトンなクラスを作成しておきます。
requestContext.jsclass RequestContext { init(userId) { this.userId = userId } getUserId() { return this.userId } } export default new RequestContext()Expressサーバ
下記の記述を、他のルーティングの上部に配置します。
express/app.jsimport requestContext from 'path/to/requestContext' app.use((req, res, next) => { if (!req.session.userId) { // sessionにuesrIdがない場合は、uuidを設定 req.session.userId = uuid.v4() } // 事前に作成したrequestContextに、userIdを設定 requestContext.init(req.session.userId) next() })※ session管理には、
express-sessionを使っています。
※next()では、下部に処理を委ねます。winston
今回loggerにはwinstonを用います。
例ではtimestampとログレベルも出力してます。logger.jsimport { createLogger, format, transports } from 'winston' import path from 'path' import requestContext from './requestContext' import formaDate from 'date-fns/format' const { combine, timestamp, printf } = format const logFormatter = printf( ({ level, message, timestamp }) => `[${timestamp}] [${level.toUpperCase()}] [${requestContext.getUserId()}] ${message}` ) const timestampFormatter = () => formaDate( new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }), 'YYYY-MM-DD HH:mm:ss' ) const logger = createLogger({ level: 'info', format: combine( timestamp({ format: timestampFormatter }), logFormatter ), transports: [ new transports.Console(), new transports.File({ filename: 'path/to/application.log' }) ] }) export logger検証
logger呼び出し例
import logger from 'path/to/logger' logger.error('test!!')出力例
application.log[2019-10-30 11:08:18] [ERROR] [6ffd3f48-c967-43ac-88e3-d6886c82d3a5] test!!
- 投稿日:2019-11-01T00:03:51+09:00
Node.jsのCloud Tasksクライアントでタスク作成をリトライする
Node.jsのCloud Tasksクライアントを使っていると、たまにgRPCのエラーでタスクの作成に失敗することがありました。リトライのための設定がややわかりにくかったので、リトライする方法をまとめておきます。
バージョン
- @google-cloud/tasks: 1.5.1
- google-gax: 1.7.5
設定方法
ドキュメントにあるように、
CloudTasksClient.createTask()の第2引数に CallOptions を渡すとリトライなどの設定を行えます。具体的な設定例は次の通りです。const client = new CloudTasksClient(); const request = { parent: client.queuePath(project, location, queue), task: { appEngineHttpRequest: { httpMethod: "POST", relativeUri: "/log_payload" } } }; const options = { retry: { retryCodes: [ 13 // INTERNAL ], // リトライ対象のエラーコードを1つ以上指定する backoffSettings: { initialRetryDelayMillis: 100, // 最初のリトライ間隔(ミリ秒) retryDelayMultiplier: 1.3, // リトライ間隔の増加率 maxRetryDelayMillis: 60000, // リトライ間隔の最大値 initialRpcTimeoutMillis: 20000, // 最初のタイムアウト(ミリ秒) rpcTimeoutMultiplier: 1, // タイムアウトの増加率 maxRpcTimeoutMillis: 20000, // タイムアウトの最大値 totalTimeoutMillis: 600000 // 全体のタイムアウト(ミリ秒) } } }; const [response] = await client.createTask(request, options);
retry.retryCodesに1つ以上のエラーコードを指定しないとリトライされません。エラーコードは実際にタスク作成に失敗したときの例外にcodeとして含まれています。一覧はgoogle-gaxのソースコードで確認できます。
retry.backoffSettingsに書いているのは、createTask()の第2引数を指定しなかった場合に使われるデフォルト値です。ドキュメントに記載がなかったので、デバッグ実行して確認しました。このデフォルト値は設定ファイルから生成されているようです。終わりに
ちゃんとコードを読んだわけではないですが、タスクの作成は冪等な処理ではないので、安全側に倒して自動リトライしないのだと思われます。リトライする場合には、同じタスクが2個作られてしまっても問題ないような実装にするよう気をつけましょう。