最近學了Express框架,在學習的過程中,參考了一些資料,感覺Express框架比原生Node.js好用多了。下面我將我學習總結的內容如下:
Express中文網 http://www.expressjs.com.cn/
Express英文網 http://expressjs.com/
一、Express框架
Express框架是后台的Node框架,所以和jQuery、zepto、yui、bootstrap都不是一個東西。
Express在后台的受歡迎的程度,和jQuery一樣,就是企業的事實上的標准。
● 原生Node開發,會發現有很多問題。比如:
■ 呈遞靜態頁面很不方便,需要處理每個HTTP請求,還要考慮304問題
■ 路由處理代碼不直觀清晰,需要寫很多正則表達式和字符串函數
■ 不能集中精力寫業務,要考慮很多其他的東西
安裝Express框架,就是使用npm的命令
1 npm install --save express
--save參數,表示自動修改package.json文件,自動添加依賴項。
路由能力:
1 var express = require("express"); 2 3 var app = express(); 4 5 app.get("/",function(req,res){ 6 res.send("你好"); 7 }); 8 9 app.get("/haha",function(req,res){ 10 res.send("這是haha頁面,哈哈哈哈哈哈"); 11 }); 12 13 app.get(/^\/student\/([\d]{10})$/,function(req,res){ 14 res.send("學生信息,學號" + req.params[0]); 15 }); 16 17 app.get("/teacher/:gonghao",function(req,res){ 18 res.send("老師信息,工號" + req.params.gonghao); 19 }); 20 21 app.listen(3000);
靜態文件伺服能力:
1 app.use(express.static("./public"));
模板引擎:
1 var express = require("express"); 2 3 var app = express(); 4 5 app.set("view engine","ejs"); 6 7 app.get("/",function(req,res){ 8 res.render("haha",{ 9 "news" : ["我是小新聞啊","我也是啊","哈哈哈哈"] 10 }); 11 }); 12 13 app.listen(3000);
二、路由
當用get請求訪問一個網址的時候,做什么事情:
1 app.get("網址",function(req,res){ 2 3 });
當用post訪問一個網址的時候,做什么事情:
1 app.post("網址",function(req,res){ 2 3 });
如果想處理這個網址的任何method的請求,那么寫all
1 app.all("/",function(){ 2 3 });
這里的網址,不分大小寫,也就是說,你路由是
1 app.get("/AAb",function(req,res){ 2 res.send("你好"); 3 });
三、中間件
如果我的的get、post回調函數中,沒有next參數,那么就匹配上第一個路由,就不會往下匹配了。
如果想往下匹配的話,那么需要寫next()
1 app.get("/",function(req,res,next){ 2 console.log("1"); 3 next(); 4 }); 5 6 app.get("/",function(req,res){ 7 console.log("2"); 8 });
路由get、post這些東西,就是中間件,中間件講究順序,匹配上第一個之后,就不會往后匹配了。next函數才能夠繼續往后匹配。
app.use()也是一個中間件。與get、post不同的是,他的網址不是精確匹配的。而是能夠有小文件夾拓展的。
比如網址: http://127.0.0.1:3000/admin/aa/bb/cc/dd
1 app.use("/admin",function(req,res){ 2 res.write(req.originalUrl + "\n"); // /admin/aa/bb/cc/dd 3 res.write(req.baseUrl + "\n"); // /admin 4 res.write(req.path + "\n"); // /aa/bb/cc/dd 5 res.end("你好"); 6 });
● 大多數情況下,渲染內容用res.render(),將會根據views中的模板文件進行渲染。如果不想使用views文件夾,想自己設置文件夾名字,那么app.set("views","aaaa");
● 如果想寫一個快速測試頁,當然可以使用res.send()。這個函數將根據內容,自動幫我們設置了Content-Type頭部和200狀態碼。send()只能用一次,和end一樣。和end不一樣在哪里?能夠自動設置MIME類型。
● 如果想使用不同的狀態碼,可以:
res.status(404).send('Sorry, we cannot find that!');
● 如果想使用不同的Content-Type,可以:
res.set('Content-Type', 'text/html');
四、GET請求和POST請求的參數
● GET請求的參數在URL中,在原生Node中,需要使用url模塊來識別參數字符串。在Express中,不需要使用url模塊了。可以直接使用req.query對象。
● POST請求在express中不能直接獲得,必須使用body-parser模塊。使用后,將可以用req.body得到參數。但是如果表單中含有文件上傳,那么還是需要使用formidable模塊。
Node中全是回調函數,所以我們自己封裝的函數,里面如果有異步的方法,比如I/O,那么就要用回調函數的方法封裝。