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フォルダができる
(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>
以上