Express中間件與request(四)

Express 是一個(gè)路由和中間件 Web 框架席楚,其自身只具有最低程度的功能:Express 應(yīng)用程序基本上是一系列中間件函數(shù)調(diào)用。

第一部分

概述
概念: 中間件函數(shù)能夠訪問(wèn)請(qǐng)求對(duì)象 (req)汛骂、響應(yīng)對(duì)象 (res) 以及應(yīng)用程序的請(qǐng)求/響應(yīng)循環(huán)中的下一個(gè)中間件函數(shù)。下一個(gè)中間件函數(shù)通常由名為 next 的變量來(lái)表示。

簡(jiǎn)單來(lái)說(shuō): 就是在收到請(qǐng)求后和發(fā)送響應(yīng)之前這個(gè)階段執(zhí)行的一些函數(shù)退疫。

下一個(gè)中間件函數(shù)通常由名為 next 的變量來(lái)表示榜揖。use是express注冊(cè)中間件的方法勾哩,它返回一個(gè)函數(shù)。

如果當(dāng)前中間件函數(shù)沒(méi)有結(jié)束請(qǐng)求/響應(yīng)循環(huán)举哟,那么它必須調(diào)用 next()思劳,以將控制權(quán)傳遞給下一個(gè)中間件函數(shù)。否則妨猩,請(qǐng)求將保持掛起狀態(tài)潜叛。

3.jpeg

主要功能有

執(zhí)行任何代碼。
對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改壶硅。
結(jié)束請(qǐng)求/響應(yīng)循環(huán)威兜。
調(diào)用堆棧中的下一個(gè)中間件。

主要分類為:

應(yīng)用級(jí)中間件
路由級(jí)中間件
錯(cuò)誤處理中間件
內(nèi)置中間件
第三方中間件

第二部分 中間件與兩大對(duì)象(request router)

2.1 應(yīng)用級(jí)中間件

概念:使用 app.use() 和 app.METHOD() 函數(shù)將應(yīng)用層中間件綁定到應(yīng)用程序?qū)ο蟮膶?shí)例庐椒,其中 METHOD 是中間件函數(shù)處理的請(qǐng)求的小寫(xiě) HTTP 方法(例如 GET椒舵、PUT 或 POST)。

入門方法如下, 調(diào)用next和不調(diào)用next的區(qū)別以及原因:

var express = require('express');
var app = express();
app.use(function(req, res, next) {
  console.log(req.method +  req.url);
  next();
});
//因?yàn)樯线呎{(diào)用了 next(); 所以執(zhí)行
app.use(function(req, res) {
  res.end("Hello 51code!\n");
});
//方法不執(zhí)行, 因?yàn)樯线叿椒](méi)有調(diào)用next();
app.use(function(req, res) {
  res.end("我是最后的一個(gè)\n");
});
app.listen(3000);

use方法內(nèi)部可以對(duì)訪問(wèn)路徑進(jìn)行判斷约谈,據(jù)此就能實(shí)現(xiàn)簡(jiǎn)單的路由笔宿,根據(jù)不同的請(qǐng)求網(wǎng)址犁钟,返回不同的網(wǎng)頁(yè)內(nèi)容。

在安裝點(diǎn)使用安裝路徑裝入一系列中間件函數(shù)的示例: get 方法獲取id

var express = require('express');
var app = express();
//在安裝點(diǎn)使用安裝路徑裝入一系列中間件函數(shù)的示例: get 方法獲取id 
app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info');
  //如果不調(diào)用next(), 下邊的方法就不會(huì)執(zhí)行
  //next();
});

app.get('/user/:id', function (req, res, next) {
    console.log('執(zhí)行:', req.params.id);
});
app.listen(3000);

結(jié)果

url : /user/about
中間件/about
中間件子堆棧1
2.2 對(duì)象request

app.use
不是來(lái)處理請(qǐng)求的, 而是來(lái)加載處理請(qǐng)求的路由模塊的參數(shù).

//引用模塊 生成對(duì)象
var express = require('express');
var app = express();

//掛載在根路徑下的中間件
app.use('/', function(req, res, next){
    console.log('根');
    res.send('hello 51code');
    next(); 
});
//掛載在根路徑下的/user的中間件
app.use('/user', function(req, res, next){
    console.log('/user');
    next();
});
//掛載在根路徑下的/user下的about的子堆棧的中間件
app.use('/user/about', function(req, res, next){
    console.log('about');
});

app.listen(3000);

app.get
等等 HTTP 請(qǐng)求的操作, 統(tǒng)一在 app.routes
著一個(gè)模塊里邊

app.get('/user/:id', function(req, res){
    //cookie
    console.log('cookie: ' + req.cookies);
    //獲取路由的parameters
    console.log('parameters: ' + req.params.id);
    res.send('user ' + req.params.id);
    var method = req.method.toLowerCase();
    //http方法
    console.log('http方法: ' + req.method);
    //請(qǐng)求URL中的路徑部分措伐。
    console.log('路徑部分: ' + req.path);
    //請(qǐng)求頭
    console.log('請(qǐng)求頭: ' + req.get('Content-Type'));

    if (method==='get'){
        // GET請(qǐng)求處理
    } else if (method==='put'){
        // PUT請(qǐng)求處理
    }
    res.end();
});

app.listen(3000);
2.3 路由

router路由器對(duì)象是一個(gè)獨(dú)立的中間件和路由實(shí)例特纤。你可以把它想象成一個(gè)“迷你應(yīng)用程序”,只能夠執(zhí)行中間件和路由功能侥加。每個(gè)Express應(yīng)用都有一個(gè)內(nèi)置的應(yīng)用路由器捧存。

中間件就像一個(gè)請(qǐng)求管道(pipe),會(huì)從請(qǐng)求的第一個(gè)中間件開(kāi)始担败,依次向下傳遞到每一個(gè)可匹配的路徑昔穴。

具體實(shí)現(xiàn)在代碼中

//路由級(jí)中間件
var express = require('express');
var app = express();
//Express.Router是一個(gè)構(gòu)造函數(shù),調(diào)用后返回一個(gè)路由器實(shí)例提前。
var router = express.Router();

// use方法為router對(duì)象指定中間件吗货,即在數(shù)據(jù)正式發(fā)給用戶之前,對(duì)數(shù)據(jù)進(jìn)行處理狈网。
router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});
//使用該實(shí)例的HTTP動(dòng)詞方法宙搬,為不同的訪問(wèn)路徑,指定回調(diào)函數(shù)拓哺;最后勇垛,掛載到某個(gè)路徑。
router.get('/home', function(req, res) {
  res.send('首頁(yè)');
});
router.get('/about', function(req, res) {
  res.send('關(guān)于');
});
//router實(shí)例對(duì)象的route方法士鸥,可以接受訪問(wèn)路徑作為參數(shù)闲孤。
router.route('/route')
    .post(function(req, res) {
        consoe.log('post');
    })
    .get(function(req, res) {
        console.log('get');
    });

// 只有請(qǐng)求 /index/* 才會(huì)被發(fā)送到 "router"處理
app.use('/index', router);
app.listen(3000);

方法
1. 掛載中間件: router.use([path], [function, ...] function)
2. 接受訪問(wèn)路徑作為參數(shù): router.route(path)
3. 創(chuàng)建指定HTTP方法的路由:router.METHOD(path, [callback, ...] callback)

第三部分

express獲取參數(shù)有三種方法:官網(wǎng)介紹如下

1. Checks route params (req.params), ex: /user/:id 
    可以通過(guò)使用**req.params**得到,
2. Checks query string params (req.query), ex: ?id=12
    獲取客戶端**GET**方式**傳遞過(guò)來(lái)的值**烤礁,通過(guò)使用**req.query.id**就可以獲得
3. Checks urlencoded body params (req.body), ex: id=
    獲取客戶端**POST**過(guò)來(lái)的數(shù)據(jù)讼积,可以通過(guò)**req.body.id**獲取

參考
Node.js開(kāi)發(fā)入門—Express里的路由和中間件
node.js學(xué)習(xí)筆記(20) express中間件
NodeJs中的express框架獲取http參數(shù)

更多精彩內(nèi)容請(qǐng)關(guān)注“IT實(shí)戰(zhàn)聯(lián)盟”哦~~~


IT實(shí)戰(zhàn)聯(lián)盟.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脚仔,隨后出現(xiàn)的幾起案子勤众,更是在濱河造成了極大的恐慌,老刑警劉巖鲤脏,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件决摧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凑兰,警方通過(guò)查閱死者的電腦和手機(jī)掌桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姑食,“玉大人波岛,你說(shuō)我怎么就攤上這事∫舭耄” “怎么了则拷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贡蓖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我煌茬,道長(zhǎng)斥铺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任坛善,我火速辦了婚禮晾蜘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眠屎。我一直安慰自己剔交,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布改衩。 她就那樣靜靜地躺著岖常,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葫督。 梳的紋絲不亂的頭發(fā)上竭鞍,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音橄镜,去河邊找鬼偎快。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛉鹿,可吹牛的內(nèi)容都是我干的滨砍。 我是一名探鬼主播往湿,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妖异,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了领追?” 一聲冷哼從身側(cè)響起他膳,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绒窑,沒(méi)想到半個(gè)月后棕孙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡些膨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蟀俊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片订雾。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肢预,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洼哎,到底是詐尸還是另有隱情烫映,我是刑警寧澤沼本,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站锭沟,受9級(jí)特大地震影響抽兆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜族淮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一辫红、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞧筛,春花似錦厉熟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乍炉,卻和暖如春绢片,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岛琼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工底循, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槐瑞。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓熙涤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親困檩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祠挫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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