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 相关文章推荐
CSDN轮换广告图片轮换效果
Mar 27 Javascript
JavaScript Event学习第七章 事件属性
Feb 07 Javascript
前端轻量级MVC框架CanJS详解
Sep 26 Javascript
js拆分字符串并将分割的数据放到数组中的方法
May 06 Javascript
讲解JavaScript中for...in语句的使用方法
Jun 03 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
JS创建或填充任意长度数组的小技巧汇总
Oct 24 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的静态成员函数效率更高的原因
2014/06/13 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
推荐20家国外的脚本下载网站
2011/04/28 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
jquery操作select大全
2014/04/25 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
Python学习资料
2007/02/08 Python
详解python中的 is 操作符
2017/12/26 Python
Python中six模块基础用法
2019/12/08 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
上班打牌检讨书
2014/02/07 职场文书
师说教学反思
2014/02/07 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
销售会计岗位职责
2014/03/15 职场文书
公司运动会策划方案
2014/05/25 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
写给老婆的保证书
2015/02/27 职场文书
社会实践单位意见
2015/06/05 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技