Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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サーバを実装していこうと思います。

ritukiii
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした