node.js入門

node.jsとは

Node.jsはサーバー側で動作するJavaScriptであり、Web業界ではかなり注目されています。大量の処理に対応するために、ノンブロッキングI/Oというモデルを採用されている

いまアツいJavaScript!ゼロから始めるNode.js入門〜5分で環境構築編〜

node.js(イベントループ)

node.jsは大量のリクエストを処理していくための仕組みであるが、これまでもApacheのようにスレッドモデルの仕組みが使われていた。

スマホなどで膨大なリクエストが来た場合にどうしても対応できない問題が発生してきたのでnode.jsはイベントループという仕組みを採用した。

  • スレッドモデル

リクエストが来た時にスレッドという処理が立ち上がる。 次のリクエストが来た場合、スレッドは同時に一つのリクエストしか処理できないため新しいスレッドを作って対応することになる。 スレッドを立ち上げるにはメモリを消費するのでたくさんのリクエストが来ると、スレッドを立ち上げることができなくなり、リクエストが待ち状態になってしまう。   

  • イベントループ

そんなスレッドモデルに代わって出てきたのがイベントループ。メインスレッドとバックグランドで動いているスレッドがある。 メインスレッドには処理待ちのキューがあって、そこに処理がたまっている間、ループを回して別のリクエストが来た場合キューに登録していく。 そしてループが回ってキューに何かが登録されているのを見たら順にバックグラウンドの処理に回す。 ただ処理が終わる順番がわからない上、ループをブロックしないように書かなくてはならない。

Webサーバーを作成する

  • server.js
//httpとfsを読み込む
var http = require('http'),
    fs = require('fs');
//settingsファイルを読み込む
var settings = require('./settings');
var server = http.createServer();

//serverにリクエストが来た時の処理
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の設定を読み込む
server.listen(settings.port, settings.host);
console.log("server listening ...");
  • settings.js
exports.port = 1337;
exports.host = '192.168.0.11'; //localhost
  • public_html/hello.html
<html>
<h1>Hello!</h1>
</html>

ターミナルにて以下コマンドを実行する

node server.js

f:id:suga-tech3:20160912234401p:plain

mysql × node.js

npm install mysqlでモジュールインストール

var mysql = require('mysql');

//mysql接続情報
var connection = mysql.createConnection({
  host  : 'localhost',
  user  : 'user_name',
  password : 'password',
  database : 'database_name' 
});

//sql作成
var sql = 'SELECT * FROM user WHERE id = ?;';

var userId = "1";

//接続する
connection.connect();

//プレースホルダー使用
var query = connection.query(sql, [userId]);

query
//error処理
.on('error', function(err) {
  console.log('err is: ', err);
})
//結果
.on('result', function(rows) {
    console.log('The res is: ', rows );
})
//終了
.on('end', function(rows) {
  console.log('end');
  connection.destroy(); //接続終了
});

上記ソースを以下コマンドで実行

$ node mysql.js
The res is:  RowDataPacket { id: 1, nickname: 'kosachan' }

上記データが取得できます。 node.jsまだ入門ですが次回はフレームワークexpressと合わせたコードを書いていけたらと思います。