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");