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)潜叛。
主要功能有
執(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)盟”哦~~~