node.js -- 設計簡單的 WebServer
JavaScript簡介歷史開發工具基本語法運算式分枝迴圈函數陣列物件導向原型封裝繼承多型this控制流程進階功能Eval 函數ClosureJSONP小書籤字串正規表達式除錯方法伺服端播 midicookie套件ccc函式庫2D 繪圖3D 繪圖影像處理訊號處理語音處理數學計算tex 數學式格式轉換桌面應用自然語言地理資訊平台Node.jsjQuerynumeric.jsTitanium引擎語法作品翻譯精靈繪圖精靈DotWiki流程前端工程師後端工程師css訊息相關網站參考文獻最新修改簡體版English |
專案下載:WebServer.zip 簡介由於 node.js 採用 Event Queue 的方式執行 (類似 Win3.1 中的協同式多工),而沒有採用 Thread 的方式,因此對所有 輸出入 IO 都應該盡可能採用非同步的方式執行,這樣才能讓 node.js 程式發揮最大的效能,否則就會因為 IO 而卡住。 因此以下兩個版本當中,以非同步版速度較快。 同步版:WebServerSync.jsvar path = require('path'); var fs = require("fs"); var qs = require('querystring'); var express = require("express"); var app = express(); app.listen(80); var response = function(res, type, text) { res.writeHead(200, {'Content-Type': type}); res.write(text); console.log(text); res.end(); } app.get('*', function(req, res){ try { var path = '.' + req.url; fs.stat(path, function(err, pathStat) { if (err) { response(res, "text/plain", err.toString()); return; } if (pathStat.isFile()) { fs.readFile(path, "utf8", function(err, file) { response(res, "text/html", file); }); } else if (pathStat.isDirectory()) { var dirPath = req.url; if (dirPath.substring(-1)!=="/") dirPath = dirPath+"/"; var html = "<html><body><h1>"+req.url+"</h1>\n"; fs.readdir(path, function(err, files) { for (f in files) { fname = files[f]; filePath = dirPath+fname; html += "<li><a href='"+filePath+"'>"+fname+"</a></li>\n"; } html += "<body></html>"; response(res, "text/html", html); }); } }); } catch (err) { response(res, "text/plain", err.toString()); } }); console.log('start WebServer\n'); 非同步版:WebServerAsync.jsvar path = require('path'); var fs = require("fs"); var qs = require('querystring'); var express = require("express"); var app = express(); app.listen(80); var response = function(res, type, text) { res.writeHead(200, {'Content-Type': type}); res.write(text); console.log(text); res.end(); } app.get('*', function(req, res){ try { var path = '.' + req.url; fs.stat(path, function(err, pathStat) { if (pathStat.isFile()) { fs.readFile(path, "utf8", function(err, file) { response(res, "text/html", file); }); } else if (pathStat.isDirectory()) { var html = "<html><body>"; fs.readdir(path, function(err, files) { for (f in files) { fname = files[f]; filePath = req.url+fname; html += "<li><a href='"+filePath+"'>" +filePath+"</a></li>\n"; } html += "<body></html>"; response(res, "text/html", html); }); } }); } catch (err) { response(res, "text/plain", err.toString()); } }); console.log('start WebServer\n'); |
page revision: 10, last edited: 10 Aug 2012 04:45
Post preview:
Close preview