node-middleware
-
- 有一步步的詳細代碼
-
為什么互聯(lián)網(wǎng)公司開始用node.js做web服務的中間件删顶?有什么好處嗎闰靴? - 天豬的回答 - 知乎
- 乍一看衙吩,似乎這一層一直都存在蚌本,只不過是由后端同學維護而已加矛。
- 我們知道煌妈,前端貼近用戶側儡羔,需求的變化太快了,后端同學來維護會很累璧诵。
- 在 BFF 理念中汰蜘,最重要的一點是:服務自治,誰使用誰開發(fā)之宿,即它應該由前端同學去維護
-
- 服務端接口族操,究竟是面向 UI 還是通用服務?
- 一句話闡述:讓純前端開發(fā)者比被,只需寫幾個 Function 即可使用到后端相關的能力色难。
(node去請求數(shù)據(jù)再拼接再輸出,會不會慢等缀?node的請求是服務器內(nèi)部的枷莉,會很快?)
-
- (有代碼片段尺迂,比較詳細豐富)
- 由nginx做接口轉發(fā)笤妙、負載,varnish做數(shù)據(jù)緩存層噪裕,node是業(yè)務處理層危喉,在4核服務器上啟動4個node進程(跟cpu核數(shù)對應),通過nginx的ip_hash做負載均衡州疾,將請求均分給各個node進程辜限,充分利用cpu的性能;node進程在收到請求后會通過內(nèi)網(wǎng)調(diào)用發(fā)送http請求獲取后端接口數(shù)據(jù)严蓖;varnish是一款高性能薄嫡、開源的反向代理服務器和緩存服務器氧急,我們在nginx跟node之間加了一層varnish緩存系統(tǒng),通過配置在varnish緩存整條接口請求毫深,減少相同請求的透傳提高中間層服務性能吩坝。
- 上圖可學習的;對象結構的寫法哑蔫、object().keys()是啥钉寝、throw new ApiError、async是否就是return的promise
- (去看看優(yōu)秀代碼闸迷,不用糾結全部看懂嵌纲,就是去看看類似的需求的寫法,如其他項目http是如何封裝的腥沽,async的錯誤處理)
- (中間層還能來做錯誤搜集和數(shù)據(jù)監(jiān)控)
中間層接口由使用接口的前端工程師開發(fā)逮走,對展現(xiàn)和接口的功能更加熟悉,避免了以前的工作模式中接口方跟各方的需求對接今阳、溝通师溅、聯(lián)調(diào)時間,這樣使得項目的推進更加順利盾舌,項目迭代會更快墓臭;
- koa2框架的中間件機制實現(xiàn)得非常簡潔和優(yōu)雅,這里學習一下框架中組合多個中間件的核心代碼妖谴。
// async函數(shù)自動返回Promise對象
const middleware2 = async (req, res, next) => {
console.log('middleware2 start')
await new Promise(resolve => {
setTimeout(() => resolve(), 1000)
})
await next()
console.log('middleware2 end')
}
(延時的寫法)
-
- 有github倉庫代碼
- 使用 koa 搭建 node 中間層服務器
使用 koa-bodyparser 中間件解析請求參數(shù)
使用 koa-router 中間件配置路由
自定義 restful api 中間件
使用 axios 來轉發(fā)封裝請求
完善路由起便、控制器
- 如何選擇正確的Node框架:Express,Koa還是Hapi窖维?
- 貌似koa和中間件相關的插件多一些榆综,且async的寫法更清晰,就用這個試試吧
- Koa的基本使用
- 這個有代碼铸史,可以參考著寫寫
- 下面代碼很清晰的看出了洋蔥模型
const Koa = require('Koa');
const app = new Koa();
// 最外層的中間件
app.use(async (ctx, next) => {
await console.log(`第 1 個執(zhí)行`);
await next();
await console.log(`第 8 個執(zhí)行`);
});
// 第二層中間件
app.use(async (ctx, next) => {
await console.log(`第 2 個執(zhí)行`);
await console.log(`第 3 個執(zhí)行`);
await next();
await console.log(`第 6 個執(zhí)行`);
await console.log(`第 7 個執(zhí)行`);
});
// 最里層的中間件
app.use(async (ctx, next) => {
await console.log(`第 4 個執(zhí)行`);
ctx.body = "Hello world.";
await console.log(`第 5 個執(zhí)行`);
});
app.listen(3000, () => {
console.log(`Server port is 3000.`);
})
- 7.3k star
- 對前后端接口調(diào)試的痛點分析很在理琳轿,就是不知道用起來怎么樣