LotosLabo

プログラミング技術とか気になった情報を載せていきます

Node.jsについて1

;

Node.jsとは

javaScriptをサーバー上で動くようにしたものです。


開発環境


まずはnode.jsのインストールです。

http://nodejs.org/
にアクセスして、INSTALLをします。
そしたら手順に沿ってインストールしていきます。

環境パスを設定しておきます。


そしてうまくインストールされたか、コマンドプロンプトで確認します。

バージョンは node --version で確認できます。


nodeを始めるにはnode と入力し、

終了するには.exit と入力します。


nodeの始め方


記法は基本的にjavaScriptです。
コマンド・ライン側でコードを書くのではなく、jsファイルを作成して読み込ませる形になります。

ファイルを読み込むコマンドは

node ファイル名.js です。


では例としてコマンドを実行させてみます。
今回はノンブロッキングな書き方で書いた処理を実行させます。

これがノンブロッキングで書いた処理です。

例:

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

これはhelloとworldを分けて一秒後に表示する処理です。
処理に時間がかかりそうな処理をブロックしない。コールバック関数を使っています。

いきなり、ノンブロッキングとかコールバック関数とか出てきましたが、ちょこっと説明します。

ノンブロッキングとは…

ノンブロッキングとは、データの入出力において、送受信の完了を待たずに他の処理を開始する方法です。

なぜ必要なのか?

今までのサーバーでは、アクセスするたびにスレッドを生成して処理をしていました。
そのためアクセス数が増えるとスレッド生成により大量にメモリを消費する問題があった。
そこで1つのスレッドで非同期的に処理ができれば、アクセス数が増えても大丈夫じゃないかという話になり、イベントループモデルというのが出できた。
1つのスレッドでぐるぐる回るのでメモリの消費量は少なく抑えられる。
しかし、途中でブロックするような処理が入ると途端に遅くなる。
そこでノンブロッキングを使うようになった。

Pimp my Codeさんより抜粋


ここで、逆にブロッキングな書き方を紹介します。

例:

var start = new Date().getTime();
while(new Date().getTime() < start + 1000);
console.log("world");


これだとすべての動作をブロックしている形になってしまいます。


Webサーバーを作る

server.js

というJavaScriptファイルを作成します。

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();
});
server.listen(1337,'192.168.56.1');
console.log("server listening...");

一応決まった書き方です。

なお、ここの部分はこのように入れてください。
server.listen(1337,'自分のIP');

IPアドレスコマンドプロンプト
ipconfigで調べられます。 IPv4のアドレスを使ってください。


そしてServerがつながっていることを確認するために、Webブラウザで見ます。
調べるときは自分のアドレスに1337を付けます。

例:
192.168.56.1:1337

サーバーを止めるときは
Control + C です。


f:id:lo25131:20140401145945j:plain

f:id:lo25131:20140401145957j:plain

設定を外部ファイルに移す

外部ファイルで使うために、設定を読み込ませます。

settings.js というファイルを作ります

例:

exports.port = 1337;
exports.host = '192.168.56.1';

を記入することで、他のファイルにポート番号とアドレスを渡します。


受け取るファイル server.js の方にこれを記述する.

var settings = require('./settings');

これでファイルの場所を記述して読み込ませる。


また、外部からポートとアドレスを指定するので以下の文を変更します。
server.js

//server.listen(1337,'192.168.56.1');
server.listen(settings.port,settings.host);



URLで処理を変える

ブラウザ画面に表示させる文字をURLにより変えます。

//res.write('Hello world');
res.write('Hello from' + req.url);

これをこのように変えると、アクセスしてきたURLによって文字が変わります。
例えば、

http://192.168.56.1:1337/about

としますと、

Hello from/about と表示されます。


そしてこれを任意の文字列に表示させます。

例:

server.on('request', function(req,res){
switch(req.url) {
case '/about':
msg = "about this page";
break;
case '/profile':
msg = "about me";
break;
default:
msg = 'wrong page';
break;
}

switch文で、req.urlを文字列に合わせて条件分岐させました。

また、ここをこのように変えれば完成です。

//res.write('Hello from' + req.url);
res.write(msg);

これでアクセスしてきたURLで表示する文字を変えることが出来ます。

f:id:lo25131:20140401161134g:plain



HTMLファイルを読み込んで表示

まずhtmlファイルを作成しましょう。
特に何も書かなくていいので、html5で形式だけを書きましょう。

新たに、public_htmlディレクトリを作成し、この中にhello.htmlファイルを作成します.

hello.html

<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Node.js</title>
</head>
<body>
	<h1>Hello World!</h1>
</body>
</html>



こんなかんじで。

ではこれを読み込むプログラムを server.jsの方に書いていきます。

server.js

全体のプラグラムから見ていきます。

例:

var http = require('http'),
	fs = require('fs');
var settings = require('./settings');
var server = http.createServer();
server.on('request', function(req,res) {
	fs.readFile(__dirname + '/public_html/hello.html', 'utf-8',function(err,data) {
		if(err){
			res.writeHead(404,{'content-Type': 'text/plain'});
			res.write("not found");
			return res.end();
}
	res.writeHead(200,{'content-Type': 'text/html'});
	res.write(data);
	res.end();
	});
});
server.listen(settings.port, settings.host);
console.log("server listening ...");



2行目にて、 fs = require('fs') でファイルを取り扱うために追加します。

5行目にて、fs.readFile でファイルを読み込みます。
この中には、__dirnameでカレントディレクトリを取得し、今回はpublic_htmlディレクトリの中に、hello.htmlファイルでhtmlファイルを作成しました。
また、uft-8で文字コード指定し、最後にファイルを読み込むために、エラー処理をします。

エラー処理は、エラーが起きた時と、起きなかった時の2パターンに分けます。エラーが起きた時には、404を返し、「not found」とテキストを表示させます。また、returnをつけることで戻ることを防ぎます。
起きなかった時はそのまま使います。


これでサーバーを立ち上げて,ブラウザに接続すると、Hello World!と表示されるはずです。