node.js -- 設計簡單的 WebServer

JavaScript

簡介

歷史

開發工具

基本語法

運算式

分枝

迴圈

函數

陣列

物件導向

原型

封裝

繼承

多型

this

控制流程

進階功能

Eval 函數

Closure

JSONP

小書籤

字串

正規表達式

除錯方法

伺服端

播 midi

cookie

套件

ccc函式庫

2D 繪圖

3D 繪圖

影像處理

訊號處理

語音處理

數學計算

tex 數學式

格式轉換

桌面應用

自然語言

地理資訊

平台

Node.js

jQuery

Google

numeric.js

Titanium

引擎

語法

作品

翻譯精靈

繪圖精靈

DotWiki

流程

前端工程師

後端工程師

css

訊息

相關網站

參考文獻

最新修改

簡體版

English

專案下載:WebServer.zip

簡介

由於 node.js 採用 Event Queue 的方式執行 (類似 Win3.1 中的協同式多工),而沒有採用 Thread 的方式,因此對所有 輸出入 IO 都應該盡可能採用非同步的方式執行,這樣才能讓 node.js 程式發揮最大的效能,否則就會因為 IO 而卡住。

因此以下兩個版本當中,以非同步版速度較快。

同步版:WebServerSync.js

var 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.js

var 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');

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License