express是基于node.js的web開發(fā)框架
express有4個核心,分別是中間件,路由,子應(yīng)用,易用的API;
假設(shè)已經(jīng)安裝過node.js,并init過項目并生成過package.json文件,同時已經(jīng)裝過express;
1.簡單的使用,是express動起來:
// 通過require加載express模塊
var express = require('express');
var app = express();
// all函數(shù)定義中間件,相當于所有的請求都必須通過此中間件
app.all('*', function(req, res, next) {
console.log('all:req:', req);
console.log('all:res:', res);
next();
});
/* use 調(diào)用中間件的方法 */
// 掛載中間件方法到路徑上,路徑未指定的話默認是'/'
app.use(function(req, res, next){
console.log('%s %s', req.method, req.url);
/* 回調(diào)函數(shù)的next參數(shù),表示接受其他中間件的調(diào)用,函數(shù)體中的next(),表示將請求數(shù)據(jù)傳遞給下一個中間件 */
next();
});
// 掛載到路徑'/about'上的中間件,該中間件不進行任何操作
app.use('/about', function(req, res, next) {
next();
});
// 掛載中間件,設(shè)置靜態(tài)資源
app.use('/static', express.static(__dirname+'/static'));
// use不僅可以掛載中間件,還可以根據(jù)請求的地址返回不同的內(nèi)容
app.use(function(req, res, next) {
if (req.url == '/list') {
res.send('this is a list page');
} else {
next();
}
});
// 添加路由
app.get('/', (req, res) => {
// req,客戶端發(fā)送的http請求;res,服務(wù)端返回的http應(yīng)答;
res.send('hello world!');
});
app.get('/about', (req, res) => {
// send()方法,表示向瀏覽器發(fā)送一個響應(yīng)信息
res.send('this is a about page');
});
// 綁定并監(jiān)聽鏈接
app.listen(3000)
通過以上代碼,我們了解到常用的幾個方法
app.use():調(diào)用中間件,對指定的路徑進行操作;如果沒有路徑,默認為根路徑;
app.all():匹配所有的HTTP動詞,可以懂傳入的路徑進行處理;‘’對所有的路由進行處理;‘/api/’,對以、api開始的路由頁面進行處理;app.all()是一個特殊的路由方法,他為一個路徑加載中間件,對所有的方法都有效
app.get(),app.post(); 路由HTTP的get/post請求;
app.listen(); 綁定程序監(jiān)聽指定的端口;
2.創(chuàng)建路由模塊,并在應(yīng)用中加載路由模塊
/* 路由模塊 */
var express = require('express');
var router = express.Router(); // 使用express.Router類創(chuàng)建模塊化,可掛載的路由句柄
router.use(function(req, res, next) {
console.log('Time: ', Date.now());
next();
})
router.get('/', function(req, res) {
res.send('sub home page');
});
module.exports = router;
/* end */
/* 在應(yīng)用中掛載路由模塊 */
// 通過require加載express模塊
var express = require('express');
var sub = require('./router');
var app = express();
// some code....
// 加載路由模塊
app.use('/sub', sub);
// 綁定并監(jiān)聽鏈接
app.listen(3000)
/* end */
由于路由模塊掛載到路徑/sub上,所以在路由模塊中‘/’(根路徑)的實際路徑是'/sub';
3.使用模板引擎
// 通過require加載express模塊
var express = require('express');
var ejs = require( 'ejs' );
var sub = require('./router');
var app = express();
// set方法用于指定變量的值
app.set('views', __dirname+'/view'); // 設(shè)置渲染文件所在的目錄
app.set('view engine', 'html'); //設(shè)置渲染文件的后綴名為html
app.engine('.html', ejs.__express); // 對渲染的.html結(jié)尾的文件使用ejs處理
// '__dirname', 獲取當前文件所在目錄的完整目錄名
// '__express', ejs模塊的一個公共屬性,表示要渲染的文件擴展名
// 添加路由
app.get('/', (req, res) => {
// req,客戶端發(fā)送的http請求;res,服務(wù)端返回的http應(yīng)答;
res.send('hello world!');
});
// 加載路由模塊
app.use('/sub', sub);
// 綁定并監(jiān)聽鏈接
app.listen(3000)
4.什么是中間件
中間件是處理HTTP請求的函數(shù),用來完成各種特定任務(wù);一個中間件處理完,可以把相應(yīng)的數(shù)據(jù)傳入下一個中間件繼續(xù)處理;
中間件有如下幾種:
應(yīng)用及中間件:這類中間件是綁定到express實例上的,如:app.use(),app.set();
路由級中間件:他的綁定對象為express.Router();
內(nèi)置中間件:express.static()是Express唯一的內(nèi)置中間件,負責在Express應(yīng)用中提供靜態(tài)資源;
錯誤處理中間件:錯誤處理中間件和其他中間件類似,只是需要4個參數(shù),而其他使用三個;
例:app.use(function(err, req, res, next) {console.error(err.stack);}); // 多了個err參數(shù)
第三方中間件: