Node.jsとは?
サーバーサイドのJavaScriptの実行環境のことです。非同期型のイベント駆動モデルを採用しています。Googleが開発したChromeにも搭載されているJavaScriptの実行エンジンV8を利用して、非同期で大量のアクセスに耐えうるWebアプリの開発をすることができます。最近では、サーバーサイド環境だけでなくwebpackやBabel、TypeScriptコンパイラ等のWeb開発で使用するコマンドラインツールとしての役割でも広く使われるようになっています。
非同期型のイベント駆動のJavaScriptランタイム
libuvという非同期I/OをサポートするC言語のライブラリから構成されています。
Node.jsの動作環境
- Mac
- Linux
- Windows
Node.jsのメリット
大量のアクセスを同時に処理することができる点
従来のWebアプリでは、どんなにハードウェアが優れていても、ネットワーク遅延等によって、アプリの動作が重くなってしまっていました。
学習コストが低い点
JavaScriptの文法で書かれているので、フロントエンドの開発経験があれば、サーバーサイドの開発も始めることが可能で、学習コストが低いです。
昨今では。
昨今話題になっている「React」や、「AngularJS」等の開発にはNode.jsは、必要不可欠になっています。
Node.jsの採用例
- サイバーエージェント
- PayPal
- Uber
- Netflix
モジュールの違いを意識すること
Node.jsを使っている場合は、以下のモジュールの違いの意識が重要です。
コアモジュール
- Node.jsが提供するモジュール
- os、fs、path、http
npmモジュール
- サードパーティ製の外部ライブラリ
- express、axiosなど
ファイルモジュール
- 自作モジュール
ライブラリ
バックエンドのNode.jsで実装する際によく使われているライブラリをいくつかご紹介します。
bcryptjs
hash関数
パスワードの暗号化ができるライブラリです。
1 2 |
const bcrypt = require("bcryptjs"); const password = await bcrypt.hash("任意のパスワード", 10); |
10
ソルトと呼ばれるもので前後にランダムな文字列をつけるという意味合いがあります。
compare関数
1 |
const valid = await bcrypt.compare("フロントから渡されたパスワード", "DBに格納されているパスワード"); |
パスワードの入力チェックを行います。ログイン認証などで使える関数です。
ユースケース
例えば、prismaなどで新規ユーザーを作成する場合などにbcryptjsで暗号化したパスワードを渡してあげます。
jsonwebtoken
簡単にJWTというトークンを生成することができます。
1 2 3 4 |
const jwt = require("jsonwebtoken"); <span class="pl-k">const</span> <span class="pl-c1">APP_SECRET</span> <span class="pl-c1">=</span> <span class="pl-s">"任意の秘密鍵の文字列(なんでも良い)"</span><span class="pl-kos">;</span> const token = jwt.sign({ userId: "任意のユーザーID" }, APP_SECRET); |
sign関数
署名をしてランダムな文字列を生成する関数になります。
verify関数
ランダムな文字列を逆に暗号化されていない正常な文字列にデコードします。
1 |
jwt.verify("トークン", "任意の秘密鍵"); |
APP_SECRET
署名するために必要なサーバー側だけが持っている秘密鍵です。第三者の誰かがトークンを拾ったとしてもこの秘密鍵がなければデコードすることができないのでより安全な実装になります。
ユースケース
- バックエンドで新規でユーザー作成後。
- ユーザーログイン時
ポイントとしては、ユーザーから何か認証があるたびにsign関数を実行してトークンを生成している点です。トークン自体はDBに保存したりして永続化はしません。
フロントエンドのユーザーは今後はその割り当てれらたトークンをもとにバックエンドと情報をやり取りします。
この記事へのコメントはありません。