LoginSignup
168
187

More than 5 years have passed since last update.

node.js 超入門 ①node.jsでwebサーバを作ってみる

Posted at

nodeって何?

  • サーバ側で動くjavascript
  • リアルタイムで高速
  • 大量のリクエストも高速に捌けるので、APIなどで利用される

公式

自分のPCにnodeの環境を作る

nodeから推奨版をインストールする。
自動的に自分のPCの環境にあったパッケージが表示されるのでインストールすればOKです。

$ node -v
v6.11.2

インストール出来ました。

とりあえずhelloworld

hello.js
$ cat hello.js
console.log('hello world')
$ node hello.js
hello world

簡単ですね

サーバの仕組みを知っておく

スレッドモデル

  • Apache等で使われている
  • 基本的に1リクエストに対して、1スレッドで処理を対応する
  • スレッドはメモリを消費するため、瞬間的に大量のリクエストが来ると結果として多くのスレッドが立ち上がる
  • スレッドが多く立ち上がり、メモリが足りなくなり、待ちリクエスト等が発生する

イベントループモデル

  • スレッドは1つだけのシングルスレッド
  • リクエストが来る度に、スレッドのキューにリクエストをためていく
  • 裏で動いているプログラムがキューに溜まった処理を順次処理していく
  • なので、リクエスト待ちは発生しない
  • ただし、イベントをブロックしてしまうような書き方をすると、実際待ちが発生してしまう
    • 後述するノンブロッキングな処理を意識して実装する必要がある

ノンブロッキングな処理の書き方

まずはブロッキングな処理を見てみます。

// ブロッキングな書き方

var start = new Date().getTime();

// 1秒待つ
while (new Date().getTime() < start + 1000);
console.log('world');

この処理を実行すると、while文の処理を待つため、1秒後にworldが表示されます。

ではノンブロッキングな処理とはどのように書くのか。

// ノンブロッキングな書き方

setTimeout(function() {
    console.log('hello');
}, 1000);

console.log('world');

実行してみましょう。

$ node hello.js
world
hello

setTimeoutの処理を待たずに、先にworldが処理されました。
これが、ノンブロッキングな処理です。

前者のように、ブロッキングな書き方をしてしまうと、
イベントループモデルのnode.jsでも、処理待ちが発生してしまうので、
処理に時間が掛かりそうな処理に関してはcallback関数を使って処理していくのがnodeの常套手段のようです。

いよいよwebサーバを作ってみる

まずは見るのが簡単だと思うので、実際に作ってみます。

server.js
// nodeのコアモジュールのhttpを使う
var http = require('http);
var server = http.createServer();

server.on('request', function(req, res) {
    res.writeHead(200, {'Content-Type' : 'text/plain'});
    res.write('hello world');
    res.end();
});

// サーバを待ち受け状態にする
// 第1引数: ポート番号
// 第2引数: IPアドレス
server.listen(3000);

この状態で、自分のブラウザからlocalhost:3000にアクセスしてみるとどうでしょうか。

スクリーンショット 2017-09-09 11.46.01.png

ちゃんと表示されましたね。
これまでjavascriptはブラウザ側で動くものでしたが、node.jsはこのように簡単にwebサーバとして動かす事が出来ます。

次回以降、より具体的にwebサーバを実装していこうと思います。

168
187
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
168
187