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 相关文章推荐
javascript 尚未实现错误解决办法
Nov 27 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
Apr 11 Javascript
加载jQuery后$冲突的解决办法
Jul 09 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
js事件冒泡实例分享(已测试)
Apr 23 Javascript
Javascript浅谈之this
Dec 17 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
Vue 中axios配置实例详解
Jul 27 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 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解析http获取的json字符串变量总是空白null
2015/03/02 PHP
php微信开发之谷歌测距
2018/06/14 PHP
php实现的顺序线性表示例
2019/05/04 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
关于js类的定义
2011/06/28 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
vue自定义组件实现双向绑定
2021/01/13 Vue.js
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
介绍一下linux的文件权限
2014/07/20 面试题
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
商务日语专业毕业生求职信
2013/10/26 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书