Blog

node.jsメモ(1)

  • Update2014-06-15
  • Category
    • Backend
  • Other--
node.jsメモ(1)のサムネイル画像

※学習元はトットインストールです

[node.js概要]

大量のリクエストを高速にさばくことのできるサーバーサイドWebアプリケーション言語

今まではスレッド方式。リクエストに対しスレッドができるためメモリを消費する。node.jsはイベントループ方式。キューにリクエストがたまりループで処理を実行。メモリを消費しない。ただし、ノンブロッキングな書き方が必要(ループを止めないようにする)

[公式サイト]

http://nodejs.org/
20140614最新 -v0.10.28
そのままインストール

基本

コンソールで直接コードを書いて実行

node //起動
console.log('hello world');
.exit //閉じる

ファイルを実行する

kote2-no-MacBook-Air:nodejs kote2$ pwd //ディレクトリ確認
/Users/kote2/Desktop/kote2/Vagrant/localdev/nodejs //今ここ。ファイルをここに入れる
kote2-no-MacBook-Air:nodejs kote2$ node 01_scripts.js //実行
hello world //出力

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

次の処理をブロックしない書き方をnode.jsでは行う。(主に時間の掛かりそうな処理)

// non blocking
setTimeout(function() { //コールバック関数
    console.log("hello");
}, 1000);
console.log("world"); //こちらが先に表示される

// blocking
var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("world"); //while関数が処理されてから(つまり1秒)表示される

Webサーバー

vagrant upでサーバーを起動してからコマンドを打って実行させる

node 02_scripts.js

そして以下アクセスする
http://192.168.0.8:1337/ ※アドレスは環境によって変わる

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.0.8');
console.log("server listening ...");

終了するときはctr+c

^Ckote2-no-MacBook-Air:nodejs kote2$ node 02_scripts.js

サーバーの設定を外部ファイル化する
(03_scripts.js)
http://192.168.0.8:1337/

var http = require('http');
var settings = require('./settings');
console.log(settings);
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(settings.port, settings.host);
console.log("server listening ...");

(settings.js ※同じディイレクトリに配置)

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

URLにより処理を変える

(04_scripts.js)
以下でアクセスして処理を変える
http://192.168.0.8:1337/
http://192.168.0.8:1337/about
http://192.168.0.8:1337/profile

var http = require('http');
var settings = require('./04_settings');
var server = http.createServer();
var msg;
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;
    }
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write(msg);
    res.end();
});
server.listen(settings.port, settings.host);
console.log("server listening ...");

ファイルを読み込む

http://192.168.0.8:1337/
(05_scripts.js)

var http = require('http'),
    fs = require('fs');
var settings = require('./settings');
var server = http.createServer();
var msg;
server.on('request', function(req, res) {
	//fs.readFile(__dirname + '/public_html/05.html', 'utf-8', function(err, data) {
    fs.readFile('./05.html', 'utf-8', function(err, data) { //ファイルを読み込むのでコールバック関数
        if (err) { //エラー処理
            res.writeHead(404, {'Content-Type': 'text/plain'});
            res.write("not found!");
            return res.end();            
        } //OKなら
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(data);
        res.end();
    });
});
server.listen(settings.port, settings.host);
console.log("server listening ...");

テンプレートエンジンを使う

npm(node package manager)を使う

公式サイト
https://www.npmjs.org/

今回使うのはejs
https://www.npmjs.org/package/ejs
上記サイトでインストールの仕方が書いてあるのでコマンドを打ってインストールする

$ npm install ejs

インストールすると以下の様なnode_modulesフォルダができる
20140615_03

(06_scripts.js)
readFileSync関数はブロッキングだがfsがノンブロッキング処理で行うためこの書き方で良い

var http = require('http'),
    fs = require('fs'),
    ejs = require('ejs');
var settings = require('./settings');
var server = http.createServer();
var template = fs.readFileSync('./06.ejs', 'utf-8');
var n = 0;
server.on('request', function(req, res) {
    n++;
    var data = ejs.render(template, {
        title: "hello",
        content: "World!",
        n: n
    });
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    res.end();
});
server.listen(settings.port, settings.host);
console.log("server listening ...");

(06.ejs)

<html>
<h1><%= title %></h1>
<p><%- content %></p>
<p><%= n %> views</p>
</html>

20140615_04

以上