Koa由Express团队打造的下一代,更小、更健壮、更富有表现力的 Web 框架,通过组合不同的 generator,可以写同步式的代码,异步式的执行,使得代码更加扁平化,简洁,易于阅读,并极大地提升常用错误处理效率。Koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库

在Koa中status的状态码,默认是404,如果status在整个Request/Response周期没有发生变化,那么就意味这个Request就是404,如果在Request/Response周期内改变status,那么status就是200,当然我们不需要显式的改变status,在下面的一写情况中koa就会去更改状态码

this.render('index',{});
this.send();
this.body='';

因此只需要在koa的处理Response之后,发送到浏览器之前的中间件中判断status是否404即可,处理koa自定义404页面

//first 中间件
app.use(function*(next){
    yield next;
    if(parseInt(this.status) === 404){
       this.body = '404';
    }
})

那么在处理500时候,可以使用try/catch来捕获每个中间件的异常,就可以处理500的错误

app.use(function*(next) {
    try {
        yield* next;
    } catch (e) {
       this.status = 500;
       this.body = '500';
    }
    if(parseInt(this.status) === 404){
       this.body = '404';
    }
});

测试404很简单,只需要填写一个不存在路由的URI即可,下面测试500情况

const router = require('koa-router')();
app
  .use(router.routes())
  .use(router.allowedMethods());

router.get('/', function *(next) {
    throw new Error('500');
});