はじめに
どうも。
普段は Express.js とか axios.js あたりを使ってチョメチョメしてるんですが、前提技術である Node.js について何も知らなかったので、改めて学んでみました。
内容的には以下の記事の嵩増しみたいなもんなので、改めて勉強される方はこちらの記事を推奨します。(とほほさん、いつも助かってます)
Node.js とは?
- サーバーサイドの JavaScript 実行環境
- npm ( Node Package Manager ) と呼ばれるパッケージ管理システムを同梱
- MEAN ( MongoDB + Express + AngularJS + Node.js ) と呼ばれる構成で利用されることも多い
なぜ Node.js なのか
- Google V8 JavaScript エンジン を採用しているため、高速
- 負荷の大きい処理(暗号化など)を内部で複数スレッド処理できる
- 様々なスケールに対応しうる
- 小規模なプロダクトにも対応
- 10k問題 ( クライアント1万台レベルになると性能が極端に悪化する問題 ) に対応
Node.js の歴史
- 2009: カリフォルニア州の Ryan Dahl 氏が Node.js の開発に着手
- 2011: 初期公開バージョン (
v0.1.14
) をリリース
Node.js とブラウザ JavaScript の違い
-
Node.js には
document
やwindow
などのオブジェクトは存在しない- サーバーサイドであるため、これらのDOMオブジェクトは使用できない
-
ブラウザにはファイルシステムへのアクセス機能などの API が使用できない
-
Node.js にはバージョンの制御ができる
- 過去の JavaScript バージョンを含め、プロダクトに応じた環境設定ができる
Node.js を動かしてみる
Hello World ( コンソール版 )
-
node
コマンドで js ファイルを選択することで実行ができる
node hoge.js
// hoge.js
console.log("Hello World!");
Hello World ( Web 版 )
- Web サーバとして動作させたい場合は、以下のように
http
ライブラリを使う- 以下のコードを書いた後、ブラウザで
localhost:8080
にアクセスすると確認できる
- 以下のコードを書いた後、ブラウザで
// hoge.js
const PORT = 8080;
var http = require('http');
var server = http.createServer(function(req, res) {
res.write("Hello world!\n");
res.end();
}).listen(PORT);
- または、別のコンソールを開いて
curl
を使うことでも確認できる
curl localhost:8080
コンソールに出力する
-
console.log()
: ログの出力関数。基本的にはこれを使う。 -
process.stdout.write()
: ↑の改行なしバージョン。
クライアントからの情報を得る
- Web のシステムは リクエスト(要求) と レスポンス(応答) のセットで動いている
- これらはそれぞれ
req
、res
と命名されることが多い - 上のコードでも
http.createServer()
の引数の関数で受け取っているのがわかる
- これらはそれぞれ
// hoge.js
const PORT = 8080;
var http = require('http');
var server = http.createServer(function(req, res) { // <- ここ
res.write("Hello world!\n");
res.end();
}).listen(PORT);
- この
req
にはさまざまなデータが詰まっている- URL: ユーザーがアクセスした場所
-
メソッド: ユーザーがサービスに対してやりたいこと(例:
GET
→ データが欲しい) -
Content-Type: データの種類を示すもの(例:
text/html
→ HTMLデータ)
// hoge.js
const PORT = 8080;
var http = require('http');
var server = http.createServer(function(req, res) {
console.log("URL: " + req.url);
console.log("Method: " + req.method);
console.log("Header[Content-Type]: " + req.headers['content-type']);
res.end();
}).listen(PORT);
参考