koa中間件記錄

一、koa的錯(cuò)誤處理
  1. koa-onerror
    koa有error事件殖氏,當(dāng)發(fā)生錯(cuò)誤雅采,可以通過(guò)error事件慨亲,對(duì)錯(cuò)誤統(tǒng)一處理。
var Koa = require('koa');
var app = Koa();
app.on('error', function(err,ctx){
    console.log(err);
});   
app.listen(3000);

上面這段代碼在如果捕獲到錯(cuò)誤巴刻,頁(yè)面會(huì)打印出 “Internal Server Error” (這是Koa對(duì)錯(cuò)誤的默認(rèn)處理)铐望。這個(gè)錯(cuò)誤我們?cè)诰C合監(jiān)控系統(tǒng)中也經(jīng)常見(jiàn)到,那么我們顯然無(wú)法根據(jù)這條日志得到什么信息。

TypeError: Cannot read property 'split' of undefined
at Object.Home.index (d:\test\route\home.js:143:31)
at GeneratorFunctionPrototype.next (native)
at Object.dispatch (d:\test\node_modules\koa-router\lib\router.js:97:44)
at GeneratorFunctionPrototype.next (native)

這些錯(cuò)誤信息是怎么報(bào)出來(lái)的的呢乒验,其實(shí)是Koa-onerror 中間件蒂阱,它優(yōu)化錯(cuò)誤信息狂塘,根據(jù)這些錯(cuò)誤信息就能更好的捕獲到錯(cuò)誤荞胡。

var onerror = require('Koa-onerror');
    onerror(app);
二了嚎、koa日志
  1. koa-logger
app.use(require('koa-logger'));
  1. log4js
    log4js提供了多個(gè)日志等級(jí)分類歪泳,同時(shí)也能替代console.log輸出。另外它可以按照文件大小或者日期來(lái)生成本地日志文件敌卓,還可以使用郵件等形式發(fā)送日志伶氢。

用法:http://www.reibang.com/p/6b816c609669(version<2.0)

三癣防、請(qǐng)求數(shù)據(jù)解析

1、koa-bodyparser

用來(lái)解析body惧蛹,比如通過(guò)post來(lái)傳遞表單刑枝、json或上傳文件,數(shù)據(jù)不容易獲取靠娱,通過(guò)koa-bodyparser解析之后掠兄,在koa中this.body就能獲取到數(shù)據(jù)蚂夕。

支持json,form,text類型

用法:

const bodyparser = require('koa-bodyparser');
app.use(bodyparser({
  enableTypes:['json', 'form', 'text']
}))

參數(shù):

  • disableBodyParser,可以動(dòng)態(tài)設(shè)置不轉(zhuǎn)換
app.use(async (ctx, next) => {
  if (ctx.path === '/disable') ctx.disableBodyParser = true;
  await next();
});
app.use(bodyparser());
  • onerror侈贷,用戶化設(shè)置轉(zhuǎn)換出錯(cuò)時(shí)的處理
app.use(bodyparser({
  onerror: function (err, ctx) {
    ctx.throw('body parse error', 422);
  }
}));

2俏蛮、koa-multer

解析multipart/form-data類型

const multer = require('koa-multer');
app.user(multer());
四、路由處理

1争涌、koa-router
① 基本用法:

var router = require('koa-router')();
router.get('/', function(ctx, next){
  ...
});

app
  .use(router.routes())
  .use(router.allowedMethods());

② router.get/post/put/del/all

router
  .get('/', function (ctx, next) {
        ctx.body = 'Hello World!';
  })
  .post('/users', function (ctx, next) {
  })
  .put('/users/:id', function (ctx, next) {
  })
  .del('/users/:id', function (ctx, next) {
  })
  .all('/users/:id', function (ctx, next) {
  });

③ 多個(gè)中間件

router.get(
  '/users/:id',
  function (ctx, next) {
    return User.findOne(ctx.params.id).then(function(user) {
      ctx.user = user;
      return next();
    });
  },
  function (ctx) {
    console.log(ctx.user);
    // => { id: 17, name: "Alex" }
  }
);
五亮垫、其他

1、koa-json
美觀的輸出JSON response的Koa中間件
有兩種使用方式:
一種是總是返回美化了的json數(shù)據(jù):

const json = require('koa-json');
app.use(json());

另一種是默認(rèn)不進(jìn)行美化抑党,但是當(dāng)?shù)刂窓趥魅雙retty參數(shù)的時(shí)候包警,則返回的結(jié)果是進(jìn)行了美化的。

app.use(json({ pretty: false, param: 'pretty' }));

2底靠、koa-static
用于koa的靜態(tài)文件指定映射路徑害晦。

const staticServe = require('koa-static');
app.use(staticServe(root, opts));

參數(shù):
① root:靜態(tài)文件的根目錄
② opts:

  • maxage
    瀏覽器緩存的最大時(shí)間(max-age),單位是milliseconds(毫秒)暑中。默認(rèn)為0
  • hidden
    允許傳送隱藏文件壹瘟,默認(rèn)為false
  • index
    Default file name, defaults to ‘index.html’
  • defer
    If true, serves after yield next, allowing any downstream middleware to respond first.
  • gzip
    當(dāng)client支持 gzip 而且被請(qǐng)求的文件也有一個(gè)以 .gz 為擴(kuò)展名的文件的時(shí)候,自動(dòng)以所請(qǐng)求文件對(duì)應(yīng)的 .gz 文件進(jìn)行返回鳄逾。默認(rèn)為true
  • extensions
    Try to match extensions from passed array to search for file when no extension 是合格的 in URL. First found is served. (defaults to false)

3稻轨、koa-views
用于指定視圖的渲染模板類型

app.use(views(__dirname + '/views', {
    extension: 'jade',
    map: {
        html: 'underscore'
    },
    engineSource: {
        foo: () => Promise.resolve('bar')
    },
    options: {
        helpers: {
            uppercase: (str) => str.toUpperCase()
        },
        partials: {
            subTitle: './my-partial' // requires ./my-partial.hbs
        }
    }
}));

參數(shù):
① root雕凹,指明view文件的絕對(duì)路徑(注意這里不能用相對(duì)路徑)殴俱;
② opt,這里面又包含著四個(gè)配置項(xiàng):

  • extension枚抵,用于指明view文件的默認(rèn)后綴名线欲。
  • map,指明后綴名為某種類型的文件采用何種引擎進(jìn)行處理汽摹。如上例中即指明后綴為.html的文件使用underscore引擎進(jìn)行處理李丰。
  • engineSource,指明后綴名為某類型的文件采用某engine source來(lái)進(jìn)行處理逼泣,替換掉默認(rèn)的engine source —— consolidate趴泌。上例中表示所有以.foo為后綴的文件會(huì)被返回’bar’。
  • options拉庶,這是傳入helpers和partials的地方嗜憔,這些options會(huì)被傳入到view engine中。

開(kāi)啟koa-views的debug模式:
在啟動(dòng)koa服務(wù)的時(shí)候添加一個(gè) DEBUG=koa-views 環(huán)境變量氏仗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痹筛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子廓鞠,更是在濱河造成了極大的恐慌帚稠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件床佳,死亡現(xiàn)場(chǎng)離奇詭異滋早,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砌们,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)杆麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浪感,你說(shuō)我怎么就攤上這事昔头。” “怎么了影兽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵揭斧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我峻堰,道長(zhǎng)讹开,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任捐名,我火速辦了婚禮旦万,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镶蹋。我一直安慰自己成艘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布贺归。 她就那樣靜靜地躺著淆两,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牧氮。 梳的紋絲不亂的頭發(fā)上琼腔,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音踱葛,去河邊找鬼丹莲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尸诽,可吹牛的內(nèi)容都是我干的甥材。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼性含,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洲赵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叠萍,失蹤者是張志新(化名)和其女友劉穎芝发,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苛谷,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辅鲸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腹殿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片独悴。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锣尉,靈堂內(nèi)的尸體忽然破棺而出刻炒,到底是詐尸還是另有隱情,我是刑警寧澤自沧,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布坟奥,位于F島的核電站,受9級(jí)特大地震影響暂幼,放射性物質(zhì)發(fā)生泄漏筏勒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一旺嬉、第九天 我趴在偏房一處隱蔽的房頂上張望管行。 院中可真熱鬧,春花似錦邪媳、人聲如沸捐顷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迅涮。三九已至,卻和暖如春徽龟,著一層夾襖步出監(jiān)牢的瞬間叮姑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工据悔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留传透,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓极颓,卻偏偏與公主長(zhǎng)得像朱盐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菠隆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理兵琳,服務(wù)發(fā)現(xiàn)狂秘,斷路器,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 原文鏈接:http://www.reibang.com/p/6b816c609669 前傳 出于興趣最近開(kāi)始研究k...
    懸筆e絕閱讀 7,218評(píng)論 1 11
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,826評(píng)論 6 342
  • 1.簡(jiǎn)書(shū) koa是由Express原班人馬打造躯肌,致力于成為一個(gè)更小者春、更富有表現(xiàn)力、更健壯的Web框架羡榴。使用koa編...
    不去解釋閱讀 2,666評(píng)論 0 11
  • 前傳 出于興趣最近開(kāi)始研究koa2碧查,由于之前有過(guò)一些express經(jīng)驗(yàn),以為koa還是很好上手的校仑,但是用起來(lái)發(fā)現(xiàn)還...
    阿_希爸閱讀 119,594評(píng)論 81 240