nodejs 框架之express

Express是一個簡潔拯坟、靈活的node.js Web應用開發(fā)框架, 它提供一系列強大的功能晤碘,比如:模板解析、靜態(tài)文件服務友题、中間件嗤堰、路由控制等等,并且還可以使用插件或整合其他模塊來幫助你創(chuàng)建各種 Web前端學習和移動設備應用,是目前最流行的基于Node.js的Web開發(fā)框架,并且支持Ejs度宦、jade等多種模板踢匣,可以快速地搭建一個具有完整功能的網(wǎng)站。

好戈抄,下面我們就開始吧离唬!

1. NPM安裝

npm install express

2. 獲取、引用

varexpress=require('express');varapp=express();

通過變量“app”我們就可以調(diào)用express的各種方法了划鸽,好戲剛剛開始输莺,繼續(xù)加油吧戚哎!

創(chuàng)建應用

認識了Express框架,我們開始創(chuàng)建我們的第一個express應用嫂用。

在我們的默認項目主文件app.js添加如下內(nèi)容:

varexpress=require('express');varapp=express();app.get('/',function(request,response){response.send('Hello World!');});app.listen(80);

說明:在后面課程學習中型凳,我們會統(tǒng)一使用80端口用于監(jiān)聽請求。

添加完畢之后尸折,通過右側(cè)欄的“測試地址”來查看瀏覽器內(nèi)容啰脚,當看到“Hello World!”內(nèi)容就表明一個簡單的express應用已經(jīng)創(chuàng)建成功了。

get請求

前面我們實現(xiàn)了一個簡單的express應用实夹,下面我們就開始具體講述它的具體實現(xiàn),首先我們先來學習Express的常用方法逊抡。

get方法 —— 根據(jù)請求路徑來處理客戶端發(fā)出的GET請求存崖。

格式:app.get(path,function(request, response));

path為請求的路徑弯屈,第二個參數(shù)為處理請求的回調(diào)函數(shù),有兩個參數(shù)分別是request和response缴淋,代表請求信息和響應信息。

如下示例:

varexpress=require('express');varapp=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頁面路徑重抖、根路徑和所有路徑的處理方法。并且在回調(diào)函數(shù)內(nèi)部祖灰,使用HTTP回應的send方法钟沛,表示向瀏覽器發(fā)送一個字符串。

參照以上代碼局扶,試試自己設定一個get請求路徑恨统,然后瀏覽器訪問該地址是否可以請求成功。

Middleware<中間件>

1.什么是中間件三妈?

中間件(middleware)就是處理HTTP請求的函數(shù)畜埋,用來完成各種特定的任務,比如檢查用戶是否登錄畴蒲、分析數(shù)據(jù)悠鞍、以及其他在需要最終將數(shù)據(jù)發(fā)送給用戶之前完成的任務。 它最大的特點就是模燥,一個中間件處理完咖祭,可以把相應數(shù)據(jù)再傳遞給下一個中間件。

2.一個不進行任何操作涧窒、只傳遞request對象的中間件心肪,大概是這樣:

functionMiddleware(request,response,next){next();}

上面代碼的next為中間件的回調(diào)函數(shù)。如果它帶有參數(shù)纠吴,則代表拋出一個錯誤硬鞍,參數(shù)為錯誤文本。

functionMiddleware(request,response,next){next('出錯了!');}

拋出錯誤以后固该,后面的中間件將不再執(zhí)行锅减,直到發(fā)現(xiàn)一個錯誤處理函數(shù)為止。如果沒有調(diào)用next方法,后面注冊的函數(shù)也是不會執(zhí)行的伐坏。

all函數(shù)的基本用法

和get函數(shù)不同app.all()函數(shù)可以匹配所有的HTTP動詞怔匣,也就是說它可以過濾所有路徑的請求,如果使用all函數(shù)定義中間件桦沉,那么就相當于所有請求都必須先通過此該中間件每瞒。

格式:app.all(path,function(request, response));

如下所示,我們使用all函數(shù)在請求之前設置響應頭屬性纯露。

varexpress=require("express");varapp=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);

上面代碼參數(shù)中的“*”表示對所有路徑有效剿骨,這個方法在給特定前綴路徑或者任意路徑上處理時會特別有用,不管我們請求任何路徑都會事先經(jīng)過all函數(shù)埠褪。

如果所示浓利,如果我們跳過all函數(shù)又會怎么樣呢,自己動手試一試钞速?

use基本用法1

use是express調(diào)用中間件的方法贷掖,它返回一個函數(shù)。

格式:app.use([path], function(request, response, next){});

//可選參數(shù)path默認為"/"渴语。

1. 使用中間件

app.use(express.static(path.join(__dirname,'/')));

如上呢苹威,我們就使用use函數(shù)調(diào)用express中間件設定了靜態(tài)文件目錄的訪問路徑(這里假設為根路徑)。

2. 如何連續(xù)調(diào)用兩個中間件呢遵班,如下示例:

varexpress=require('express');varapp=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('示例:連續(xù)調(diào)用兩個中間件');});app.listen(80);

回調(diào)函數(shù)的next參數(shù)屠升,表示接受其他中間件的調(diào)用,函數(shù)體中的next()狭郑,表示將請求數(shù)據(jù)傳遞給下一個中間件腹暖。

上面代碼先調(diào)用第一個中間件,在控制臺輸出一行信息翰萨,然后通過next()脏答,調(diào)用第二個中間件,輸出HTTP回應亩鬼。由于第二個中間件沒有調(diào)用next方法殖告,所以req對象就不再向后傳遞了。

use基本用法2

use方法不僅可以調(diào)用中間件雳锋,還可以根據(jù)請求的網(wǎng)址黄绩,返回不同的網(wǎng)頁內(nèi)容,如下示例:

varexpress=require("express");varapp=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屬性玷过,判斷請求的網(wǎng)址爽丹,從而返回不同的內(nèi)容筑煮。

回調(diào)函數(shù)

Express回調(diào)函數(shù)有兩個參數(shù),分別是request(簡稱req)和response(簡稱res)粤蝎,request代表客戶端發(fā)來的HTTP請求真仲,request代表發(fā)向客戶端的HTTP回應,這兩個參數(shù)都是對象初澎。示例如下:

function(req,res){});

在后面的學習中秸应,我們會經(jīng)常和它打交道,牢牢記住它的格式吧碑宴!

獲取主機名软啼、路徑名

今天我們就先來學習如何使用req對象來處理客戶端發(fā)來的HTTP請求。

req.host返回請求頭里取的主機名(不包含端口號)延柠。

req.path返回請求的URL的路徑名焰宣。

如下示例:

varexpress=require('express');varapp=express();app.get("*",function(req,res){console.log(req.path);res.send("req.host獲取主機名,req.path獲取請求路徑名!");});app.listen(80);

試一試在瀏覽器中輸入任意一個請求路徑捕仔,通過req查看主機名或請求路徑。

query基本用法

query是一個可獲取客戶端get請求路徑參數(shù)的對象屬性盈罐,包含著被解析過的請求參數(shù)對象榜跌,默認為{}。

varexpress=require('express');varapp=express();app.get("*",function(req,res){console.log(req.query.參數(shù)名);res.send("測試query屬性!");});app.listen(80);

通過req.query獲取get請求路徑的對象參數(shù)值盅粪。

格式:req.query.參數(shù)名钓葫;請求路徑如下示例:

例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請求一個帶參數(shù)路徑,使用“req.query.參數(shù)名”方法獲取請求參數(shù)值票顾。

param基本用法

和屬性query一樣础浮,通過req.param我們也可以獲取被解析過的請求參數(shù)對象的值。

格式:req.param(“參數(shù)名”)奠骄;請求路徑如下示例:

例1: 獲取請求根路徑的參數(shù)值豆同,如/?n=Lenka,方法如下:

varexpress=require('express');varapp=express();app.get("/",function(req,res){console.log(req.param("n"));//Lenkares.send("使用req.param屬性獲取請求根路徑的參數(shù)對象值!");});app.listen(80);

例2:我們也可以獲取具有相應路由規(guī)則的請求對象含鳞,假設路由規(guī)則為 /user/:name/影锈,請求路徑/user/mike,如下:

app.get("/user/:name/",function(req,res){console.log(req.param("name"));//mikeres.send("使用req.param屬性獲取具有路由規(guī)則的參數(shù)對象值!");});

PS:所謂“路由”,就是指為不同的訪問路徑蝉绷,指定不同的處理方法鸭廷。

看了上面的示例,試一試使用req.param屬性解析一個請求路徑對象熔吗,并獲取請求參數(shù)值辆床。

params基本用法

和param相似,但params是一個可以解析包含著有復雜命名路由規(guī)則的請求對象的屬性桅狠。

格式:req.params.參數(shù)名讼载;

例1. 如上課時請求根路徑的例子轿秧,我們就可以這樣獲取,如下:

varexpress=require('express');varapp=express();app.get("/user/:name/",function(req,res){console.log(req.params.name);//mikeres.send("使用req.params屬性獲取具有路由規(guī)則的參數(shù)對象值!");});app.listen(80);

查看運行結(jié)果维雇,和param屬性功能是一樣的淤刃,同樣獲取name參數(shù)值。

例2:當然我們也可以請求復雜的路由規(guī)則吱型,如/user/:name/:id逸贾,假設請求地址為:/user/mike/123,如下:

app.get("/user/:name/:id",function(req,res){console.log(req.params.id);//"123"res.send("使用req.params屬性復雜路由規(guī)則的參數(shù)對象值!");});

對于請求地址具有路由規(guī)則的路徑來說津滞,屬性params比param屬性是不是又強大了那么一點點呢铝侵!

send基本用法

send()方法向瀏覽器發(fā)送一個響應信息,并可以智能處理不同類型的數(shù)據(jù)触徐。格式如下: res.send([body|status], [body]);

1.當參數(shù)為一個String時咪鲜,Content-Type默認設置為"text/html"。

res.send('Hello World');//Hello World

2.當參數(shù)為Array或Object時撞鹉,Express會返回一個JSON疟丙。

res.send({user:'tobi'});//{"user":"tobi"}res.send([1,2,3]);//[1,2,3]

3.當參數(shù)為一個Number時,并且沒有上面提到的任何一條在響應體里鸟雏,Express會幫你設置一個響應體享郊,比如:200會返回字符"OK"。

res.send(200);// OKres.send(404);// Not Foundres.send(500);// Internal Server Error

send方法在輸出響應時會自動進行一些設置孝鹊,比如HEAD信息炊琉、HTTP緩存支持等等。


轉(zhuǎn)自:http://cnodejs.org/topic/561b51252fb53d5b4f232a2b

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末又活,一起剝皮案震驚了整個濱河市苔咪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柳骄,老刑警劉巖团赏,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夹界,居然都是意外死亡馆里,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門可柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸠踪,“玉大人,你說我怎么就攤上這事复斥∮埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵目锭,是天一觀的道長评汰。 經(jīng)常有香客問我纷捞,道長,這世上最難降的妖魔是什么被去? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任主儡,我火速辦了婚禮,結(jié)果婚禮上惨缆,老公的妹妹穿的比我還像新娘糜值。我一直安慰自己,他們只是感情好坯墨,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布寂汇。 她就那樣靜靜地躺著,像睡著了一般捣染。 火紅的嫁衣襯著肌膚如雪骄瓣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天耍攘,我揣著相機與錄音榕栏,去河邊找鬼。 笑死蕾各,一個胖子當著我的面吹牛臼膏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播示损,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嚷硫!你這毒婦竟也來了检访?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤仔掸,失蹤者是張志新(化名)和其女友劉穎脆贵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體起暮,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卖氨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了负懦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筒捺。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纸厉,靈堂內(nèi)的尸體忽然破棺而出系吭,到底是詐尸還是另有隱情,我是刑警寧澤颗品,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布肯尺,位于F島的核電站沃缘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏则吟。R本人自食惡果不足惜槐臀,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓仲。 院中可真熱鬧水慨,春花似錦、人聲如沸寨昙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舔哪。三九已至欢顷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捉蚤,已是汗流浹背抬驴。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缆巧,地道東北人布持。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像陕悬,于是被迫代替她去往敵國和親题暖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容