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 21 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
javascript里绝对用的上的字符分割函数总结
Jul 31 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
jQuery满意度星级评价插件特效代码分享
Aug 19 Javascript
js实现无缝滚动特效
Dec 20 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
jQuery动态修改字体大小的方法【测试可用】
Sep 09 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
Apr 13 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 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 checkbox 取值详细说明
2010/08/19 PHP
php socket通信简单实现
2016/11/18 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
js去除浏览器默认底图的方法
2015/06/08 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Python字典简介以及用法详解
2016/11/15 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
简单谈谈python中的语句和语法
2017/08/10 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python一键去抖音视频水印工具
2018/09/14 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python实现银行实战系统
2020/02/26 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
采购员岗位职责
2013/11/15 职场文书
个人整改方案范文
2014/10/25 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
人口与计划生育责任书
2015/05/09 职场文书
小学生读书笔记
2015/07/01 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python