kao和express都是同乙個團隊開發的,koa框架會用也會寫—(koa的實現)已經介紹koa的原理,而koa在express的基礎上進行了優化:
從上面的可以知道express的大致框架:
//監聽函式
let method = req.method.tolowercase();
let = url.parse(req.url,true);
let index = 0;
// 建立了乙個next函式,用來派發中介軟體、路由,事項洋蔥模型
function next()
next();
} //內部封裝了http模組
server.listen(...arguments)
} methods.foreach(method =>
//處理帶引數的路由/user/:id/:name
let keys = ;
if(pathname.includes(":")));
layer.params = keys; // 路徑引數key陣列[id,name]
// 轉化成正則類似/\/user\/([^\/]*)\/([^\/]*)/來匹配請求路徑
// 後面會介紹使用的地方
layer.reg = new regexp(regstr); }}
});let layer =
} // 註冊中介軟體
if(typeof handler === 'undefined')
let layer =
} }複製**let method = req.method.tolowercase();
let = url.parse(req.url,true);
let index = 0;
function next()
next();
} server.listen(...arguments)
} if(typeof handler === 'undefined')
let layer =
} let method = req.method.tolowercase();
let = url.parse(req.url, true);
req.path = pathname;
req.query = query;
req.hostname = req.headers.host.split(':')[0];
對返回各種型別相容處理
res.send = function (params) else if (typeof (params) === 'number') else
}file返回檔案
res.sendfile = function (pathname)
重定向res.redirect = function (pathname)
next();
})}複製**
let method = req.method.tolowercase();
let = url.parse(req.url,true);
let index = 0;
function next(err) else
} else
let matchers = req.path.match(layer.reg);
req.params = layer.params.reduce((memo, current, index) => (memo[current] = matchers[index + 1], memo), {});
return layer.handler(req, res);}}
//router處理不含請求引數的路由
if ((layer.pathname === req.path || layer.pathname === '*') && (layer.method === method || layer.method === 'all'))
next() //router的處理會自動呼叫next()
}}else $`);}}
next();
}複製**
let method = req.method.tolowercase();
let = url.parse(req.url,true);
let index = 0;
function next(err) else
}else else
} else );
return layer.handler(req, res);}}
if ((layer.pathname === req.path || layer.pathname === '*') && (layer.method === method || layer.method === 'all'))
next()}}
}else $`);}}
next();
}複製**
使用express渲染邏輯主要是呼叫res.render方法,其中使用最多的就是ejs模板引擎,ejs渲染邏輯可以參考koa框架會用也會寫—(koa-view、koa-static)
複製**
if(typeof handler !== 'function')
let layer =
} // 配置
} }
let method = req.method.tolowercase();
let = url.parse(req.url, true);
req.path = pathname;
req.query = query;
req.hostname = req.headers.host.split(':')[0];
res.send = function (params) else if (typeof (params) === 'number') else
}res.sendfile = function (pathname)
res.redirect = function (pathname)
//通過render對頁面進行渲染
res.render = function (filename,obj) );
}next();
})}複製**
這裡簡化了邏輯:
return function (req,res,next) else
}}複製**
express的bodyparser也是通過外掛程式引入
// body-parser.js
function urlencoded() )
req.on('end', function (data) )
}else
}}function json() )
req.on('end', function (data) )
} else
}}module.exports.urlencoded = urlencoded
module.exports.json = json
複製**
前面koa框架會用也會寫—(koa的實現)已經詳細介紹了koa的原理和中介軟體,這裡主要是表示express和koa不同的地方,主要的外掛程式邏輯可能都簡化了,再次說明express的不同: koa和express比較 以及 koa原始碼解讀
koa 使用的是async await等待 經典句型 await next 類似堆疊先進後出 引數 ctx,next express 是逐步流下去的,走到最後都不匹配,資源返回404,xhr返回500 引數 req,res,next 原始碼解讀 待補充 new koa 時候自動執行了construc...
注意!list和array是不同的
python中的list是python的內建資料型別,list中的資料型別不必相同的,而array的中的資料型別必須全部相同。numpy中封裝的array有很強大的功能,裡面存放的都是相同的資料型別。list 如下 a 1,2 1,2 二維列表 print a b a 1 1 print b 執行結...
express框架的安裝和使用
express是當今最流行的nodejs框架之一。想學nodejs框架 express是個不錯的選擇,下面談談安裝express框架並並建立例項 1.安裝 首先通過npm 全域性安裝express npm install g express 通過上面的命令我們可以全域性安裝express框架,也可以...