Appearance
koa的错误处理
错误处理是应用健壮性非常重要的一部分,所以提前到这里来讲,koa 在错误处理的便利上比 express 好非常多。
koa 有 error 事件,当发生错误时,可以通过该事件,对错误进行统一的处理。
我们创建个 error.js:
javascript
var koa = require('koa');
var app = koa();
app.on('error', function(err,ctx){
if (process.env.NODE_ENV != 'test') {
console.log(err.message);
console.log(err);
}
});
app.listen(3000);
监听 error 事件:
- err 参数 : 错误对象,留意抛异常时,请务必抛出 Error 对象,不能只是简单的字符串,这是良好的编码习惯
- ctx :为发生请求的上下文对象
再次强调,抛出异常必须是 Error 实例。
运行:node --harmony error.js,打开 http://localhost:3000,页面会打印出 “Internal Server Error” (这是koa对错误的默认处理)。
同时会触发 error 事件,打印出 err.message。
“Internal Server Error” 的页面信息过于简陋,我们引入 koa-onerror 中间件,优化错误信息。
koa-onerror 会在 'development'`(不存在环境变量时,也会输出错误信息) 时抛出错误堆栈信息。
javascript
var onerror = require('koa-onerror');
onerror(app);
再次运行试试,页面打印的信息就会变成:
html
Error
Looks like something broke!
Error: demo error
at Object.<anonymous> (/dev/node/k-demo/error.js:5:11)
at GeneratorFunctionPrototype.next (native)
at Object.respond (/dev/node/k-demo/node_modules/koa/lib/application.js:172:10)
at GeneratorFunctionPrototype.next (native)
at Object.<anonymous> (/dev/node/k-demo/node_modules/koa/node_modules/koa-compose/index.js:37:12)
at GeneratorFunctionPrototype.next (native)
at next (/dev/node/k-demo/node_modules/koa/node_modules/co/index.js:83:21)
at Object.<anonymous> (/dev/node/k-demo/node_modules/koa/node_modules/co/index.js:56:5)
at Server.<anonymous> (/dev/node/k-demo/node_modules/koa/lib/application.js:123:8)
at Server.EventEmitter.emit (events.js:110:17)
比 “Internal Server Error” 提供的信息多的多。