koa-router allowedMethods

koa-routerkoa框架的一個路由處理級別的中間件

koa-router可以說是koa必須用上的一個庫了, 其具體配置和用法我們直接查看源碼或者官方文檔,基于部分同學對router.allowedMethods()用法不理解,所以我們重點查看一下其中allowedMethods到底搞了什么貓膩,弄明白allowedMethods的應用場景

首先我們查閱koa-router的源碼看到allowedMethods方法的申明

koa-router/lib/router.js (line-401)


Router.prototype.allowedMethods = function (options) {
  options = options || {};
  var implemented = this.methods;

  return function allowedMethods(ctx, next) {
    return next().then(function() {
      var allowed = {};

    //重點代碼
    //當后續(xù)所有中間件執(zhí)行完成之后,判斷ctx的status,如果next中間件已經正確處理了response響應,則直接略過
      if (!ctx.status || ctx.status === 404) {
        ctx.matched.forEach(function (route) {
          route.methods.forEach(function (method) {
            allowed[method] = method;
          });
        });

        var allowedArr = Object.keys(allowed);

        if (!~implemented.indexOf(ctx.method)) {
          if (options.throw) {
            var notImplementedThrowable;
            if (typeof options.notImplemented === 'function') {
              notImplementedThrowable = options.notImplemented(); // set whatever the user returns from their function
            } else {
              notImplementedThrowable = new HttpError.NotImplemented();
            }
            throw notImplementedThrowable;
          } else {
            ctx.status = 501;
            ctx.set('Allow', allowedArr);
          }
        } else if (allowedArr.length) {
          if (ctx.method === 'OPTIONS') {
            ctx.status = 200;
            ctx.body = '';
            ctx.set('Allow', allowedArr);
          } else if (!allowed[ctx.method]) {
            if (options.throw) {
              var notAllowedThrowable;
              if (typeof options.methodNotAllowed === 'function') {
                notAllowedThrowable = options.methodNotAllowed(); // set whatever the user returns from their function
              } else {
                notAllowedThrowable = new HttpError.MethodNotAllowed();
              }
              throw notAllowedThrowable;
            } else {
              ctx.status = 405;
              ctx.set('Allow', allowedArr);
            }
          }
        }
      }
    });
  };
};

從源碼中我們可以看到.allowedMethods處理的業(yè)務是當所有路由中間件執(zhí)行完成之后,若ctx.status為空或者404的時候,豐富response對象的header頭.

allowedMethods 應用場景

  1. 全局應用
  var Koa = require('koa');
  var Router = require('koa-router');
 
  var app = new Koa();
  var router = new Router();
 
  app.use(router.routes());
  app.use(router.allowedMethods());

這是官方文檔的推薦用法,我們可以看到router.allowedMethods()用在了路由匹配router.routes()之后,所以在當所有路由中間件最后調用.此時根據(jù)ctx.status設置response響應頭

  1. 局部應用

有的同學將他用在了路由級的中間件

  var Koa = require('koa');
  var Router = require('koa-router');
 
  var app = new Koa();
  var router = new Router();
  router.use('/test',router.allowedMethods())
  app.use(router.routes());

這時候只有當請求路徑匹配到了/test才會執(zhí)行allowedMethods,然后根據(jù)ctx.status設置response響應頭

當然,如果我們不設置router.allowedMethods()在表現(xiàn)上除了ctx.status不會自動設置,以及response header中不會加上Allow之外,不會造成其他影響.

如果要設置,建議按照官方的寫法,搞成全局的,路由級別的配置感覺很雞肋

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末题翰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹋辅,老刑警劉巖缩筛,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洪燥,死亡現(xiàn)場離奇詭異贾富,居然都是意外死亡废赞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門贤旷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來广料,“玉大人,你說我怎么就攤上這事幼驶“樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵盅藻,是天一觀的道長购桑。 經常有香客問我,道長氏淑,這世上最難降的妖魔是什么勃蜘? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮假残,結果婚禮上缭贡,老公的妹妹穿的比我還像新娘。我一直安慰自己辉懒,他們只是感情好阳惹,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眶俩,像睡著了一般莹汤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颠印,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天纲岭,我揣著相機與錄音,去河邊找鬼线罕。 笑死止潮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的闻坚。 我是一名探鬼主播沽翔,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窿凤!你這毒婦竟也來了仅偎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤雳殊,失蹤者是張志新(化名)和其女友劉穎橘沥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯秃,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡座咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年痢艺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片介陶。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡堤舒,死狀恐怖,靈堂內的尸體忽然破棺而出哺呜,到底是詐尸還是另有隱情舌缤,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布某残,位于F島的核電站国撵,受9級特大地震影響,放射性物質發(fā)生泄漏玻墅。R本人自食惡果不足惜介牙,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澳厢。 院中可真熱鬧环础,春花似錦、人聲如沸剩拢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裸扶。三九已至,卻和暖如春搬素,著一層夾襖步出監(jiān)牢的瞬間呵晨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工熬尺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摸屠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓粱哼,卻偏偏與公主長得像季二,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揭措,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容