nodejs
ちょっと勉強するモチベーションが低下してきたので別の言語を触ってみる
環境
server.js
// httpモジュールを読み込み、サーバオブジェクトを取得 var http = require("http"); var url = require("url"); var fs = require("fs"); var path = require("path"); var ejs = require("ejs"); var qs = require("querystring"); // 外部ファイルの読み込み var settings = require("./settings.js"); // サーバ読み込み var server = http.createServer(); // メッセージ内容 var posts = []; // テンプレートファイル(BBS用) var template_bbs = fs.readFileSync(__dirname + '/templates/bbs.ejs', 'utf-8'); // 画面にメッセージのリストを表示 function renderForm(posts, res){ var data = ejs.render(template_bbs, { title: "1行掲示板サンプル", posts: posts }); // 画面に出力 res.writeHead(200, {'Content-Type': 'text/html'}); res.write(data); res.end(); } // イベント設定 server.on('request', function(req, res){ // urlをログに出力 console.log("url = " + req.url); switch(req.url){ case "/": if(req.method === 'POST'){ // postした場合は内容を保存して、画面に表示 // フォームからのデータの受信処理 req.data = ""; req.on("readable", function(){ req.data += req.read(); }); // リクエストの受信データ完了後の処理 req.on("end", function(){ var query = qs.parse(req.data); posts.push(query.name); // 画面にリストを出力 renderForm(posts, res); }); }else{ // postされていない場合は現時点の内容を表示 // 画面にリストを出力 renderForm(posts, res); } break; case "/about": res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('hello about'); res.end(); break; case "/profile": res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('hello profile'); res.end(); break; default: // パスを取得 var _path = url.parse(req.url).pathname; console.log("path = " + _path); var _localpath = settings.dir + _path; console.log("path = " + _localpath); // ノンブロッキングによるファイルの読み込み fs.readFile(_localpath, 'utf-8', function(err, data){ // エラー処理 if(err){ res.writeHead(404, {'Content-Type': 'text/plain'}); res.write('File Not Found'); return res.end(); // returnとすることでここで処理が終わる } // 拡張子を取得 var ext = ""; var n = 0; if ((n = _localpath.lastIndexOf(".")) != -1) { ext = _localpath.substring(n+1); } // 拡張子 console.log('ext = ' + ext); if(ext == "htm" || ext == "html"){ res.writeHead(200, {"Content-Type": "text/html"}); }else if(ext == "gif"){ res.writeHead(200, {"Content-Type": "image/gif"}); }else if(ext == "ico"){ res.writeHead(200, {"Content-Type": "image/ico"}); }else if(ext == "jpg" || ext == "jpeg"){ res.writeHead(200, {"Content-Type": "image/jpeg"}); }else if(ext == "css"){ res.writeHead(200, {"Content-Type": "text/css"}); }else if(ext == "js"){ res.writeHead(200, {"Content-Type": "text/javascript"}); }else{ res.writeHead(200, {"Content-Type": "text/plain"}); } res.write(data); res.end(); }); break; } }); // サーバを起動 server.listen(settings.port, settings.host); console.log('server listening ...'); console.log('server host = ' + settings.host); console.log('server port = ' + settings.port);
settings.js
/* * * 外部ファイルに設定を定義 * * exportsで指定した変数などを外部データとして * * 使用できる。 */ // ポート exports.port = 8001; // ホスト exports.host = "192.168.51.129";
templates/bbs.ejs
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>Bootstrap 101 Template</title> <!-- Bootstrap --> <link href="/css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> </head> <body> <h1><%= title %></h1> <div class="row"> <div class="col-xs-12 col-md-8"> <form method="post" class="form-inline" role="form"> <input type="text" name="name" class="form-control" placeholder="message" /> <input type="submit" value="send" class="btn btn-default" /> </form> <hr /> <ul> <% for(var i = 0; i< posts.length; i++ ){ %> <li><%= posts[i] %></li> <% } %> </ul> </div> <div class="col-xs-6 col-md-4"> </div> </div> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="/js/jquery.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="/js/bootstrap.min.js"></script> </body> </html>
結果