node.js教學-利用Express來寫HTTP伺服器

7 / 4, 2013 JS , node.js , 伺服器 , 網路

這是node.js教學的第二篇

相信各位看過第一篇node.js的教學後,都會覺得好像用node.js寫一個網站很困難。因為所有頁面的邏輯都要放在一個函數裏。

經過第一次的教學後,你可能會寫了類似於這些的東西出來:

var fs = require('fs');
var server = require('http').createServer(function(request, response){
    switch(request.url){
        case '/':
        case '/index':
            fs.createReadStream('./index.html').pipe(response);
        break;

        case '/其他頁面':
            fs.createReadStream('./index.html').pipe(response);
        break;
    }
});

著: fs 模組是node.js的檔案系統模組,而 fs.createReadStream(file) 是建立檔案資料流,至於 stream.pipe(destination) 是把資料轉至 destination

這樣子的代碼很麻煩,尤其是你又越來越多的頁面就更明顯。還有,當你的網址有變數怎麼辦呢?所以,我今天就介紹你一個模組:Express。

Express不是一個內建模組,所以請開啟您的終端機,輸入:

npm install express

這是用node.js模組管理器 npm 來安裝Express這個模組(有點像PHP的Pear)。等待安裝完成後,你會發現多了一個資料夾 node_modules ,這資料夾是用來放置node.js的額外模組的(node.js的模組是用JavaScript寫成的,也可用C++,npm會替你兼顧編譯程序)。你可以到 npmjs 網站那裡看看你自己想用什麼模組,然後用 npm install <模組名稱> 來安裝。

安裝完成後,就用上次教學的代碼來作修改。

var http = require('http');
var handleRequest = function(request, response){
    response.end("你好!");
};

var server = http.createServer(handleRequest);
server.listen(8080,'127.0.0.1',function(){
    console.log('HTTP伺服器在 http://127.0.0.1:8080/ 上運行');
});

現在,我們要把Express模組載入。

var express = require('express');

然後,我們要建立一個Express的物件。

var app = express(); //建立Express個體

接著,就把函數 handleRequest 刪除掉,並把 http.createServer(handleRequest) 的參數變成 app,因為我們現在使用Express來作HTTP伺服器。

然後,我們需要定義我們應該處理什麼樣的URL。要做到這個,我們用 app.<HTTP請求類型>(url,handler); 來設定。

app.get('/',function(request, response){ //我們要處理URL為 "/" 的HTTP GET請求
    response.end('你好!'); //作出回應
});

注意:如果你有多個頁面,您可重複上個步驟來做到。如果你想把檔案的內容作回應,就可以在 handler 內用 response.sendfile(location); 來傳送。要知道URL參數的內容,可以用 request.query.<變數名稱> 來得知。

到這裡教學就完成了。如有什麼不明白,可以隨意留言,我會盡快解答的。

此次教學全代碼:

var http = require('http');
var express = require('express');
var app = express();
var server = http.createServer(app);
app.get('/',function(request, response){ //我們要處理URL為 "/" 的HTTP GET請求
    response.end('你好!'); //作出回應
});
server.listen(8080,'127.0.0.1',function(){
    console.log('HTTP伺服器在 http://127.0.0.1:8080/ 上運行');
});

請繼續留意我的node.js教學啊!

  • not

    不太懂

    我原本有一個/index和一個/其它頁面 兩個html

    用了教學之後就只剩下 你好!

    這樣不是頁面變少了,還強迫使用respone輸出?

  • AI

    這段根本不能跑吧
    .Llisten應該直接用app去掛

    • Licson Lee

      不 .listen那個callback是代表HTTP伺服器已啟動,實際的handler是在 .createServer 就要指定的

  • s3131212

    詢問一個小問題,如果我希望能有個資料夾當作根目錄,html檔丟進去就好(像一般的伺服器軟體),這樣node.js做不做得到?

    • Licson Lee

      可以,加入這行就好。
      app.use(express.static(__dirname));

    • Licson Lee

      加入這行就可以了
      app.use(express.static(__dirname));