Koa 中的错误处理解析


Posted in Javascript onApril 09, 2019

不像 express 中在末尾处注册一个声明为 (err, req, res, next) 中间件的方式,koa 刚好相反,在开头进行注册。

app.use(async (ctx, next) => {
 try {
  await next();
 } catch (err) {
  ctx.status = err.status || 500;
  ctx.body = err.message;
  ctx.app.emit("error", err, ctx);
 }
});

这样程序中任何报错都会收敛到此处。此时可以方便地将错误打印到页面,开发时非常便捷。

+   ctx.app.emit('error', err, ctx);

koa 也建议通过 app 来派发错误,然后通过监听 app 上的 error 事件对这些错误做进一步的统一处理和集中管理。

app.on("error", (err, ctx) => {
 /* 错误的集中处理:
  * log 出来
  * 写入日志
  * 写入数据库
  *  ...
  */
});

一个错误捕获并打印到页面的示例:

const Koa = require("koa");
const app = new Koa();

app.use(async (ctx, next) => {
 try {
  await next();
 } catch (err) {
  const status = err.status || 500;
  ctx.status = status;
  ctx.type = "html";
  ctx.body = `
  <b>${status}</b> ${err}
  `;
  // emmit
  ctx.app.emit("error", err, ctx);
 }
});

app.use(ctx => {
 const a = "hello";
 a = "hello world!"; // TypeError: Assignment to constant variable.
 ctx.body = a;
});

app.on("error", (err, ctx) => {
 console.error("Ooops..\n", err);
});

app.listen(3000);

通过 node server.js 启动后访问页面可看到命令行的错误输出。

如果使用 pm2,可通过 —no-daemon 参数使其停留在在命令行以查看输出。

如果不使用上述参数,可通过 pm2 logs [app-name] 来查看。

ctx.throw

朴素的抛错方式需要手动设置状态码及信息对客户端的可见性。

const err = new Error("err msg");
err.status = 401;
err.expose = true;
throw err;

expose 决定是否会返回错误详情给客户端,否则只展示状态对应的错误文案,比如 500 会在浏览器中展示为 Internal Server Error 。

而通过 ctx.throw 这个 helper 方法会更加简洁。

上面的代码片段等价于:

ctx.throw(401, "err msg");

如果不指定状态码,默认为 500。5xx 类错误 expose 默认为 false ,即不会将错误信息返回到 response。

抛错时还可以传递一些额外数据,这些数据会合并到错误对象上,在处理错误的地方可以从 error 上获取。

app.use(ctx => {
 ctx.throw(401, "access_denied", { user: { name: "foo" } });
});

app.on("error", (err, ctx) => {
 console.error("Ooops..\n", err.user);
});

参考

Error Handling
ctx.throw

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
用jquery实现输入框获取焦点消失文字
Apr 27 Javascript
node中socket.io的事件使用详解
Dec 15 Javascript
JavaScript中字符串分割函数split用法实例
Apr 07 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
js动态设置select下拉菜单的默认选中项实例
Aug 21 Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
Apr 19 Javascript
简单说说如何使用vue-router插件的方法
Apr 08 #Javascript
利用Bootstrap Multiselect实现下拉框多选功能
Apr 08 #Javascript
纯javascript实现选择框的全选与反选功能
Apr 08 #Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 #Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
Apr 08 #Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 #Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 #Javascript
You might like
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
javascript来定义类的规范小结
2010/11/19 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
react路由配置方式详解
2017/08/07 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
python sorted函数的小练习及解答
2019/09/18 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
企业员工集体活动方案
2014/08/17 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
销售辞职信范文
2015/03/02 职场文书
2014年个人总结范文
2015/03/09 职场文书
运动会加油稿50字
2015/07/21 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书