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 中間件炒俱。