極簡Express指迷

Express

基于 Node.js 平臺,快速京腥、開放赦肃、極簡的 web 開發(fā)框架。API
豐富的 HTTP 快捷方法和任意排列組合的 Connect 中間件,讓你創(chuàng)建健壯他宛、友好的 API 變得既快速又簡單船侧。

express 是一個自身功能極簡,完全是由路由和中間件構(gòu)成一個的 web 開發(fā)框架
主要內(nèi)容如下圖所示:

圖片來自簡書

中間件

中間件(Middleware) 是一個函數(shù)厅各,它可以訪問請求對象(request object (req
)), 響應對象(response object (res
)), 和 web 應用中處于請求-響應循環(huán)流程中的中間件镜撩,一般被命名為 next
的變量。如果當前中間件沒有終結(jié)請求-響應循環(huán)队塘,則必須調(diào)用 next() 方法將控制權(quán)交給下一個中間件袁梗,否則請求就會掛起。

應用級中間件

綁定到app對象上憔古,使用app.use()和app.METHOD()
語法:app.use(url, callback)

// 若url為空遮怜,即掛載路徑為空,應用的每個請求都會執(zhí)行該中間件
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});
// 掛載至 /user/:id 的中間件鸿市,任何指向 /user/:id 的請求都會執(zhí)行它
app.use('/user/:id', function (req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// 路由和句柄函數(shù)(中間件系統(tǒng))奈泪,處理指向 /user/:id 的 GET 請求
app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});

路由級中間件

語法:var router = express.Router(), 路由級使用 router.use() 或 router.VERB() 加載。
詳細見express.Router的用法

內(nèi)置中間件-利用 Express 托管靜態(tài)文件

使用內(nèi)置中間件 express.static就可以方便的訪問靜態(tài)資源了

app.use(express.static('public')); // public 目錄下面的文件就可以訪問 `
// 如果你的靜態(tài)資源存放在多個目錄下面灸芳,你可以多次調(diào)用 express.static 中間件
app.use(express.static('public')); 
app.use(express.static('files'));
app.use('/static', express.static('public')); //通過虛擬路徑(static訪問)
http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js

錯誤處理中間件

錯誤處理中間件有 4 個參數(shù)涝桅,其簽名如下: (err, req, res, next)。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

路由

定義應用的端點(URIs)以及如何響應客戶端的請求
語法結(jié)構(gòu):app.METHOD(path, [callback...], callback)
path 是服務(wù)器上的路徑
METHOD是HTTP請求方法

Express 定義了如下和 HTTP 請求對應的路由方法: get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search, 和 connect烙样。

路由回調(diào)

可以為請求處理提供多個回調(diào)函數(shù)冯遂,可以利用該機制分配控制權(quán)給其他路徑
有多種形式,一個函數(shù)谒获、多個函數(shù)蛤肌、一個函數(shù)數(shù)組,或者是兩者混合

// 使用一個回調(diào)函數(shù)
app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});
// 使用多個回調(diào)函數(shù)處理路由(記得指定 next 對象)
app.get('/example/b', function (req, res, next) {
  console.log('response ...');
  next();
}, function (req, res) {
  res.send('This is from B!');
});
// 使用回調(diào)函數(shù)數(shù)組處理路由
var c1= function (req, res, next) {
  console.log('C1');
  next();
}

var c2 = function (req, res, next) {
  console.log('C2');
  next();
}
app.get('/example/c', [c1, c2]);
// 混合使用函數(shù)和函數(shù)數(shù)組處理路由:
var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from D!');
});

app.route()

創(chuàng)建路由路徑的鏈式路由句柄

app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

express.Router

可使用 express.Router 類創(chuàng)建模塊化批狱、可掛載的路由句柄裸准。Router 實例是一個完整的中間件和路由系統(tǒng)
在 app 目錄下創(chuàng)建名為 router.js 的文件,內(nèi)容如下:

var express = require('express');
var router = express.Router();

// 該路由使用的中間件
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// 定義網(wǎng)站主頁的路由
router.get('/', function(req, res) {
  res.send('home page');
});
// 定義 about 頁面的路由
router.get('/about', function(req, res) {
  res.send('About page');
});

module.exports = router;

然后在應用中加載路由模塊:

var router = require('./router');
...
router .use('/main', router );

應用即可處理發(fā)自 /main和 /main/about 的請求赔硫,并且調(diào)用為該路由指定的 timeLog 中間件炒俱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爪膊,隨后出現(xiàn)的幾起案子权悟,更是在濱河造成了極大的恐慌,老刑警劉巖推盛,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦阁,死亡現(xiàn)場離奇詭異,居然都是意外死亡耘成,警方通過查閱死者的電腦和手機榔昔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門驹闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撒会,你說我怎么就攤上這事疮方。” “怎么了茧彤?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵骡显,是天一觀的道長。 經(jīng)常有香客問我曾掂,道長惫谤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任珠洗,我火速辦了婚禮溜歪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘许蓖。我一直安慰自己蝴猪,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布膊爪。 她就那樣靜靜地躺著自阱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪米酬。 梳的紋絲不亂的頭發(fā)上沛豌,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音赃额,去河邊找鬼加派。 笑死,一個胖子當著我的面吹牛跳芳,可吹牛的內(nèi)容都是我干的芍锦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼飞盆,長吁一口氣:“原來是場噩夢啊……” “哼娄琉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桨啃,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤车胡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后照瘾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡丧慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年析命,在試婚紗的時候發(fā)現(xiàn)自己被綠了主卫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹃愤,死狀恐怖簇搅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情软吐,我是刑警寧澤瘩将,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站凹耙,受9級特大地震影響姿现,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肖抱,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一备典、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意述,春花似錦提佣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至术荤,卻和暖如春槐壳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喜每。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工务唐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人带兜。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓枫笛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刚照。 傳聞我的和親對象是個殘疾皇子刑巧,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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