Node.js中如果用一般的方式寫http server,就得require很多module,非常煩雜
Express就可以解決這部份的問題,Express能解決許多node.js http server 所需要的基本服務,且也很容易操作

首先要使用Express,要先安裝Express
安裝

#因為Express會產生新的指令,所以建議global安裝,可以再從npm的module以ln的方式到你的專案
sudo npm install -g express

Configuration
在一開始建立express物件時,可以先透過configure設定一些必要的參數及功能

app.configure(function() {
    this.set('views', __dirname + '/views');
    this.set('view engine', 'ejs');
    this.use(express.bodyParser());
    this.use(express.cookieParser());
	this.use(express.session({secret : "secret"}));
    this.use('/public',express.static(__dirname + '/public'));
});

基本操作方法

//引入Express且建立http server
var express = require("express");
var http = express();
var port = 1234;

//開始監聽
http.listen(port);

//當有人瀏覽該http server不同目錄時,server會依據路徑回傳hello world字串(可以使用RegExp)
http.get("/", function(req, res){
    res.send("hello world");
});

http.get("/test", function(req, res){
    res.send("This is test");
});

http.get("/haha/", function(req, res){
    //設定HTTP Header
    res.setHeader('Content-Type', 'application/json');
    res.send({a:123,b:456});
});

http.get("/html", function(req, res){
    //Express中可以直接sendfile
    res.sendfile("view/demo.html");
});

console.log("start express server");

轉址

http.get("/", function(req, res){
    res.redirect("http://google.com");
});

讓使用者在網址列輸入變數的值

//使用者輸入http://localhost/test/aaa,page就等於aaa
http.get("/test/:page", function(req, res){
    res.send("This is test, page = " + req.params.page);
});

middleware
Express中,有一個middleware的概念,其中裡面是用next方法參數傳遞,讓開發者可以明確的控制程式邏輯

var express = require("express");
var http = express();
var port = 1234;

//middleware包含三個基本參數,response、request、next
//其中next 表示下一個 middleware 執行函式,同時會自動將預設三個參數繼續帶往下個函式執行。
http.use(function (req, res, next) {
    console.log("first middle ware");
    next();
});

http.use(function (req, res, next) {
    console.log("second middle ware");
    next();
});

http.use(function (req, res, next) {
    console.log("third middle ware");
    next();
});

//也可以將middleware寫成function
function middleHandler(req, res, next) {
    console.log("execute middle ware");
    next();
}

//get函式中的第二個參數可以放入middle函式
http.get("/", middleHandler, function (req, res) {
    console.log("end middleware function");
    res.send("page render finished");
});

http.listen(port);
console.log('start server');

上段程式執行http://localhost:1234的結果,執行結果為:
first middle ware
second middle ware
third middle ware
execute middle ware
end middleware function

使用.use的middleware不管client連到任何路徑皆會執行

路由應用
在實際開發上可能會遇到需要使用參數等方式,混和變數一起使用
可以透過.all這個方法先用特定邏輯過濾,可以大量的簡化程式

// create server.
var express = require("express");
var http = express();
var port = 1234;

http.listen(port);

//定義路徑的雛型,當使用者進入/user/:id/的路徑後進到.all判斷,判斷後再透過middleware的next移動到下一個符合的事件
http.all("/user/:id/", function(req, res, next){
    if (req.params.id > 3) {
        next();
    } else {
        next(new Error("cannot find user " + req.params.id));
    }
});

http.get("/user/:id", function(req, res){
    res.send("viewing " + req.params.id);
});

http.get("/user/:id/edit", function(req, res){
    res.send("editing " + req.params.id);
});

http.get("/user/:id/delete", function(req, res){
    res.send("deleting " + req.params.id);
});

http.get("*", function(req, res){
    res.send("Page not found!", 404);
});

console.log("start express server\n");

Express取得post與get方式

get的方式其實上面已經有提到http.get()其實就是取得get參數的函式
再配合url module可以將參數個別取出來

post的話需透過http.post(),不過注意的是使用.post後,直接用瀏覽器存取該頁會顯示Cannot POST,必須一定要透過post才時

Express3.0提供了一個express.bodyParser()方法,可以將post參數都存到req.body裡

設定

var express = require("express"),
    app     = express();

app.use(express.bodyParser());

範例

<form method="POST" action="/ajax">
    <input type="hidden" name="a" value="123">
    <input type="hidden" name="b" value="456">
    <input type="hidden" name="c" value="789">
    <input type="submit" value="submit">
</form>
http.post("/ajax", function(req, res){
    console.log(req.body.a);
    console.log(req.body.b);
    console.log(req.body.c);
});

掛載資源並指定路徑
express可以引入外部資源,並指定特定的路徑
例如以下範例,這樣就可以透過http://127.0.0.1:1234/aaa/test.css連到原本public/test.css

var express = require("express"),
    app     = express();

app.use('/aaa',express.static(__dirname + '/public'));

session應用

//引入Express且建立http server
var express = require("express");
var http = express();
var port = 1234;

//Configuration
http.configure(function(){
    //啟動cookieParser
    this.use(express.cookieParser());
    //設定加密HashKey
    this.use(express.session({secret : "@5%skdg"}));
});

//開始監聽
http.listen(port);

//首頁
http.get("/", function(req, res){
    //設定session時間(單位是ms)
    req.session.cookie.maxAge = 5000;

    //設定session的值
    req.session.test = "Hello";
    req.session.test2 = "Hello2";

    if(req.session.test && req.session.test2){
        console.log(req.session.test);
        console.log(req.session.test2);
    }

    res.redirect("/logout");
});


//登出
http.get("/logout", function(req, res){
    //刪除session
    req.session.destroy(function(error){
        res.send("成功刪除session");
    });
});

console.log("start express server");
Categories: Node.js