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