Express介紹
npm提供了大量的第三方模塊,其中不乏許多Web框架,比如我們本章節要講述的一個輕量級的Web框架 ――― Express。
Express是一個簡潔、靈活的node.js Web應用開發框架, 它提供一系列強大的功能,比如:模板解析、靜態文件服務、中間件、路由控制等等,并且還可以使用插件或整合其他模塊來幫助你創建各種 Web和移動設備應用,是目前最流行的基于Node.js的Web開發框架,并且支持Ejs、jade等多種模板,可以快速地搭建一個具有完整功能的網站。
好,下面我們就開始吧!
1. NPM安裝
npm install express
2. 獲取、引用
var express = require('express');var app = express();
通過變量“app”我們就可以調用express的各種方法了,好戲剛剛開始,繼續加油吧!
創建應用
認識了Express框架,我們開始創建我們的第一個express應用。
在我們的默認項目主文件app.js添加如下內容:
var express = require('express');var app = express();app.get('/', function (request, response) { response.send('Hello World!');});app.listen(80);
說明:在后面課程學習中,我們會統一使用80端口用于監聽請求。
添加完畢之后,通過右側欄的“測試地址”來查看瀏覽器內容,當看到“Hello World!”內容就表明一個簡單的express應用已經創建成功了。
get請求
前面我們實現了一個簡單的express應用,下面我們就開始具體講述它的具體實現,首先我們先來學習Express的常用方法。
get方法 ―― 根據請求路徑來處理客戶端發出的GET請求。
格式:
app.get(path,function(request, response));
path為請求的路徑,第二個參數為處理請求的回調函數,有兩個參數分別是request和response,代表請求信息和響應信息。
如下示例:
var express = require('express');var app = express();app.get('/', function(request, response) { response.send('Welcome to the homepage!');});app.get('/about', function(request, response) { response.send('Welcome to the about page!');});app.get("*", function(request, response) { response.send("404 error!");});app.listen(80);
上面示例中,指定了about頁面路徑、根路徑和所有路徑的處理方法。并且在回調函數內部,使用HTTP回應的send方法,表示向瀏覽器發送一個字符串。
參照以上代碼,試試自己設定一個get請求路徑,然后瀏覽器訪問該地址是否可以請求成功。
Middleware<中間件>
1.什么是中間件?
中間件(middleware)就是處理HTTP請求的函數,用來完成各種特定的任務,比如檢查用戶是否登錄、分析數據、以及其他在需要最終將數據發送給用戶之前完成的任務。 它最大的特點就是,一個中間件處理完,可以把相應數據再傳遞給下一個中間件。
2.一個不進行任何操作、只傳遞request對象的中間件,大概是這樣:
function Middleware(request, response, next) { next();}
上面代碼的next為中間件的回調函數。如果它帶有參數,則代表拋出一個錯誤,參數為錯誤文本。
function Middleware(request, response, next) { next('出錯了!');}
拋出錯誤以后,后面的中間件將不再執行,直到發現一個錯誤處理函數為止。如果沒有調用next方法,后面注冊的函數也是不會執行的。
all函數的基本用法
和get函數不同app.all()函數可以匹配所有的HTTP動詞,也就是說它可以過濾所有路徑的請求,如果使用all函數定義中間件,那么就相當于所有請求都必須先通過此該中間件。
格式:
app.all(path,function(request, response));
如下所示,我們使用all函數在請求之前設置響應頭屬性。
var express = require("express");var app = express();app.all("*", function(request, response, next) { response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //設置響應頭屬性值next();});app.get("/", function(request, response) { response.end("歡迎來到首頁!");});app.get("/about", function(request, response) { response.end("歡迎來到about頁面!");});app.get("*", function(request, response) { response.end("404 - 未找到!");});app.listen(80);
上面代碼參數中的“*”表示對所有路徑有效,這個方法在給特定前綴路徑或者任意路徑上處理時會特別有用,不管我們請求任何路徑都會事先經過all函數。
如果所示,如果我們跳過all函數又會怎么樣呢,自己動手試一試?
use基本用法1
use是express調用中間件的方法,它返回一個函數。
格式:
app.use([path], function(request, response, next){});//可選參數path默認為"/"。
1. 使用中間件
app.use(express.static(path.join(__dirname, '/')));
如上呢,我們就使用use函數調用express中間件設定了靜態文件目錄的訪問路徑(這里假設為根路徑)。
2. 如何連續調用兩個中間件呢,如下示例:
var express = require('express');var app = express();app.use(function(request, response, next){ console.log("method:"+request.method+" ==== "+"url:"+request.url); next();});app.use(function(request, response){ response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); response.end('示例:連續調用兩個中間件');});app.listen(80);
回調函數的next參數,表示接受其他中間件的調用,函數體中的next(),表示將請求數據傳遞給下一個中間件。
上面代碼先調用第一個中間件,在控制臺輸出一行信息,然后通過next(),調用第二個中間件,輸出HTTP回應。由于第二個中間件沒有調用next方法,所以req對象就不再向后傳遞了。
use基本用法2
use方法不僅可以調用中間件,還可以根據請求的網址,返回不同的網頁內容,如下示例:
var express = require("express");var app = express();app.use(function(request, response, next) { if(request.url == "/") { response.send("Welcome to the homepage!"); }else { next(); }});app.use(function(request, response, next) { if(request.url == "/about") { response.send("Welcome to the about page!"); }else { next(); }});app.use(function(request, response) { response.send("404 error!");});app.listen(80);
上面代碼通過request.url屬性,判斷請求的網址,從而返回不同的內容。
回調函數
Express回調函數有兩個參數,分別是request(簡稱req)和response(簡稱res),request代表客戶端發來的HTTP請求,request代表發向客戶端的HTTP回應,這兩個參數都是對象。示例如下:
function(req, res) {});
在后面的學習中,我們會經常和它打交道,牢牢記住它的格式吧!
獲取主機名、路徑名
今天我們就先來學習如何使用req對象來處理客戶端發來的HTTP請求。
req.host返回請求頭里取的主機名(不包含端口號)。
req.path返回請求的URL的路徑名。
如下示例:
var express = require('express');var app = express();app.get("*", function(req, res) { console.log(req.path); res.send("req.host獲取主機名,req.path獲取請求路徑名!");});app.listen(80);
試一試在瀏覽器中輸入任意一個請求路徑,通過req查看主機名或請求路徑。
query基本用法
query是一個可獲取客戶端get請求路徑參數的對象屬性,包含著被解析過的請求參數對象,默認為{}。
var express = require('express');var app = express();app.get("*", function(req, res) { console.log(req.query.參數名); res.send("測試query屬性!");});app.listen(80);
通過req.query獲取get請求路徑的對象參數值。
格式:req.query.參數名;請求路徑如下示例:
例1: /search?n=Lenka
req.query.n // "Lenka"
例2: /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order // "desc"req.query.shoe.color // "blue"req.query.shoe.type // "converse"
試一試get請求一個帶參數路徑,使用“req.query.參數名”方法獲取請求參數值。
param基本用法
和屬性query一樣,通過req.param我們也可以獲取被解析過的請求參數對象的值。
格式:req.param("參數名");請求路徑如下示例:
例1: 獲取請求根路徑的參數值,如/?n=Lenka,方法如下:
var express = require('express');var app = express();app.get("/", function(req, res) { console.log(req.param("n")); //Lenka res.send("使用req.param屬性獲取請求根路徑的參數對象值!");});app.listen(80);
例2:我們也可以獲取具有相應路由規則的請求對象,假設路由規則為 /user/:name/,請求路徑/user/mike,如下:
app.get("/user/:name/", function(req, res) { console.log(req.param("name")); //mike res.send("使用req.param屬性獲取具有路由規則的參數對象值!");});
PS:所謂“路由”,就是指為不同的訪問路徑,指定不同的處理方法。
看了上面的示例,試一試使用req.param屬性解析一個請求路徑對象,并獲取請求參數值。
params基本用法
和param相似,但params是一個可以解析包含著有復雜命名路由規則的請求對象的屬性。
格式:req.params.參數名;
例1. 如上課時請求根路徑的例子,我們就可以這樣獲取,如下:
var express = require('express');var app = express();app.get("/user/:name/", function(req, res) { console.log(req.params.name); //mike res.send("使用req.params屬性獲取具有路由規則的參數對象值!");});app.listen(80);
查看運行結果,和param屬性功能是一樣的,同樣獲取name參數值。
例2:當然我們也可以請求復雜的路由規則,如/user/:name/:id,假設請求地址為:/user/mike/123,如下:
app.get("/user/:name/:id", function(req, res) { console.log(req.params.id); //"123" res.send("使用req.params屬性復雜路由規則的參數對象值!");});
對于請求地址具有路由規則的路徑來說,屬性params比param屬性是不是又強大了那么一點點呢!
send基本用法
send()方法向瀏覽器發送一個響應信息,并可以智能處理不同類型的數據。格式如下: res.send([body|status], [body]);
1.當參數為一個String時,Content-Type默認設置為"text/html"。
res.send('Hello World'); //Hello World
2.當參數為Array或Object時,Express會返回一個JSON。
res.send({ user: 'tobi' }); //{"user":"tobi"}res.send([1,2,3]); //[1,2,3]
3.當參數為一個Number時,并且沒有上面提到的任何一條在響應體里,Express會幫你設置一個響應體,比如:200會返回字符"OK"。
res.send(200); // OKres.send(404); // Not Foundres.send(500); // Internal Server Error
send方法在輸出響應時會自動進行一些設置,比如HEAD信息、HTTP緩存支持等等。
新聞熱點
疑難解答