nodejsで簡単なサービスの傍受プログラムを作ります.

4979 ワード

就職して三年ぐらい経って、しかも半年ぐらいPHP開発の仕事をしたことがあります.舞台裏、特にjs言語で開発したnodejsに興味があります.自分は関連の仕事に接触したことがありません.
今日は主に記録します.ずっと前にnodejsで簡単なサービスモニタープログラムを作りました.
皆さんご存知のように、nodejsを通じてフロントに対してモニターを要請することができます.ここではウェブサイトのハローワールドの例を紹介します.
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World
'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
以上のコードはnodeの子供靴を知ったことがあると信じています.
nodeが要求を傍受できるなら、フロントの要求によって異なるファイルやコンテンツを返すことができますか?これは簡単なサーバーじゃないですか?このような考えを持って、簡単に実験してみました.サーバーは要求されたファイルによって違います.ミニタイプを使うことができます.例えば.index.cssで使うミニタイプはtext/cssです.じゃ、私達はミニタイプを常用する簡単な配置があるべきですか?ここでは簡単なミニプロファイルを作成しました.
exports.types = {
  "css": "text/css",
  "gif": "image/gif",
  "html": "text/html",
  "ico": "image/x-icon",
  "jpeg": "image/jpeg",
  "jpg": "image/jpeg",
  "js": "text/javascript",
  "json": "application/json",
  "pdf": "application/pdf",
  "png": "image/png",
  "svg": "image/svg+xml",
  "swf": "application/x-shockwave-flash",
  "tiff": "image/tiff",
  "txt": "text/plain",
  "wav": "audio/x-wav",
  "wma": "audio/x-ms-wma",
  "wmv": "video/x-ms-wmv",
  "xml": "text/xml"
};
もちろん、これら以外にも他のフォーマットがたくさんあります.ここでは一つ一つ例を挙げません.
はい、ミニフォーマットに対応するファイルの配置ファイルがあります.これからは簡単になります.まず公式サイトの例によってモニタープログラムを構築して、モニタープログラムに簡単なwww.baidu.com/このようなリンクを追加して、デフォルトでファイルを開く処理とチェーン接続の補完などを行います.もちろん簡単なエラー処理もしなければなりません.404、500などです.コードを具体的に見る:
/*
 *  http   ,  http  
 */
var http = require("http"),
fs = require('fs'),
path = require('path'),
mine = require('./mine').types;
url = require('url');
//       
//      
var date = function(ms) {
    var date = ms ? new Date(ms) : new Date(),
    mon = date.getMonth() >= 10 + 1 ? '-' : '-0',
    d = date.getDate() >= 10 ? '-' : '-0',
    hour = date.getHours() >= 10 ? ' ' : ' 0',
    min = date.getMinutes() >= 10 ? ':' : ':0',
    sec = date.getSeconds() >= 10 ? ':' : ':0';
    return date.getFullYear() + mon + (date.getMonth() + 1) + d + date.getDate() + hour + date.getHours() + min + date.getMinutes() + sec + date.getSeconds();
},
//    log    ,    ,    
DebugLog = function(mes) {
    var now = date();
    console.log(now + " " + mes);
};
//    
exports.server = function() {
    http.createServer(function(req, res) {
    	var pathname = url.parse(req.url).pathname,//  url     
    	pathname = (pathname !== "/" && pathname) ? pathname : "/index.html";//     '/'     
        var realPath = path.join("../", path.normalize(pathname.replace(/\.\./g, ""))),//          
        ext = path.extname(realPath);
        ext = ext ? ext.slice(1) : 'unknown';//       
        //    
        fs.exists(realPath, function (exists) {
            if (!exists) {//  404
                res.writeHead(404, {
                    'Content-Type': 'text/plain'
                });

                res.write("This request URL " + pathname + " was not found on this server.");
                res.end();
            } else {//    
                fs.readFile(realPath, "binary", function (err, file) {
                    if (err) {//     500  
                        res.writeHead(500, {
                            'Content-Type': 'text/plain'
                        });
                        res.end(err);
                    } else {//      
                        var contentType = mine[ext] || "text/plain";//  mine.js         contentType
                        res.writeHead(200, {
                            'Content-Type': contentType
                        });
                        res.write(file, "binary");
                        res.end();
                    }
                });      
            }
        });
    }).listen(8888, 'localhost');
    tool.DebugLog("http    ,    127.0.0.1:8888 http  !");
}
もちろんこれは一番簡単な機能です.みんな自分で豊かにしてもいいです.この文章はここまでにしましょう.