koa --- 使用中间件多层级抛出错误

说明

  • 能够熟练的掌握错误的抛出,可以在一定程度上提高代码的开发效率和可读性

构造错误

  • 本栗采用调用一个不存在的函数来抛出错误
const Koa = require('koa');
const app = new Koa();// 响应时间输出中间件
app.use(async (ctx, next) => {await next();// 获取响应头,印证执行顺序const rt = ctx.response.get('X-Response-Time');console.log(`输出倒计时: ${ctx.method} ${ctx.url} - ${rt}`);
});// 响应时间统计中间件
app.use(async (ctx, next) => {const start = Date.now();console.log('开始计时');await next();const ms = Date.now() - start;ctx.set('X-Response-Time', `${ms}ms`);console.log('结束计时');
})// 响应
app.use(async ctx =>{await sleep(250);ctx.status = 200;ctx.type = 'html';ctx.body = `<h1>Hello Koa</h1>
})

在这里插入图片描述
在这里插入图片描述

  • 注: 函数的执行顺序:
  1. 根据洋葱模型: 首先执行 const start = Date.now()
  2. console.log('开始计时');
  3. 遇到await next()跳到下一个中间件,并将await next()后面的代码入一个函数调用栈
  4. 执行await sleep(250)
  5. 由于sleep函数未定义,于是抛出错误
  • 注: 部分api说明:

  1. const rt = ctx.response.get('X-Response-Time'): 获取请求头部中’X-Response-Time’的值
  2. ctx.set('X-Response-Time', '${ms}ms'): 返回头部’X-Response-Time’添加值

koa级别抛出错误,并获取处理错误

  • 抛出错误不进行处理
  • 将该中间件放在倒数第二个中间件的位置.
// 错误处理
app.use(async (ctx, next) => {try {await next();} catch (error) {ctx.status = error.statusCode || error.status || 500;ctx.body = error.message;// 触发应用层级的错误事件ctx.app.emit('error', error, ctx);console.log("中间件捕捉:", error.message);}
})

在这里插入图片描述
在这里插入图片描述

  • 说明:
  1. try{ await next() }: 尝试运行下一个中间件,如果遇到错误则运行catch块中的代码
  2. ctx.body = error.message: 用户级别的抛出错误,用于再浏览器中提醒用户错误的信息
  3. ctx.app.emit('error', error, ctx): koa框架应用层级的错误,错误的标识为’error’,可以通过app.on('error')来进行处理.由于此处没有app.on('error'),因此会默认的执行以下语句
// 其实不存在
app.on('error', err=>{console.error(err);
})
  • 使用app.on('error', err=>{}) 处理
// 抛出node层级的错误,
// 向上层抛出错误
app.on('error', err=>{throw err;
})

在这里插入图片描述
在这里插入图片描述

  • 注: 后台直接挂掉.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑的真正价值

1.不是应用程序&#xff0c;而是开发程序 2.高级语言就像是人类的语言&#xff0c;低级语言就像是一个全心全意帮我的社交专家&#xff0c;他帮我说服电脑实现我的指令 3.高级语言就是字节码&#xff0c;低级语言帮我转换成机器码 4.有时候&#xff0c;高级语言的一个眼神&…

Java 试题四

Java 试题四 1、abstract class 和interface 有什么区别? 【基础】 答&#xff1a;声明方法的存在而不去实现它的类被叫做抽象类&#xff08;abstract class&#xff09;&#xff0c;它用于要创建一个体现某些基本行为的类&#xff0c; 并为该类声明方法&#xff0c;但不能…

PyInstaller用法

pyinstaller定义&#xff1a;PyInstaller是一个压缩python文件成为可执行程序的一个软件。 pyinstaller工作原理&#xff1a;① 它会扫描你所有的Python文档&#xff0c;并分析所有代码从而找出所有你的代码运行所需的模块。② PyInstaller会将所有这些模块和你的code放在一个文…

koa --- 监听路由,并使用模板引擎渲染显示

使用路由 /Koa实战/routes/index.js const Router require(koa-router); const router new Router();router.get(/, ctx > {ctx.body index; });module.exports router/Koa实战/routes/users.js const Router require(koa-router); const router new Router({prefi…

公共平台服务治理与鉴权

问题 解决问题 鉴权 注册 管理 总结聊一聊最近了解的公司服务治理平台&#xff0c;主要是思想&#xff0c;理念&#xff0c;而不是一种技术或框架。整个平台设计&#xff0c;融入了OAUTH2认证&#xff0c;融入了微服务思想&#xff0c;帮助公司各系统在复杂的IT架构下&#xff…

Java 试题五

Java 试题五 1、运行时异常与一般异常有何异同 答&#xff1a;异常表示程序运行过程中可能出现的非正常状态&#xff0c;运行时异常表示虚拟机的通常操作中可能遇到的异常&#xff0c;是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常&#xff0c;…

【初赛】概率与期望学习笔记

一、事件 1、单位事件、事件空间、随机事件 在一次随机试验中可能发生的不能再细分的结果被称为单位事件&#xff0c;用 $ E $ 表示。在随机试验中可能发生的所有单位事件的集合称为事件空间&#xff0c;用 $ S $ 来表示。例如在一次掷骰子的随机试验中&#xff0c;如果用获得的…

koa --- 扩展hbs方法

moment 是一款常用的处理时间的库传入 1999-03-01T16:00:00.000Z YYYY/MM/DD输出 1999/03/02 const moment require(moment);const myDatePattern (date, pattern) >{return moment(date).format(pattern) } 给扩展hbs功能. 放在 utils/helper.js 下方便管理 const hb…

go系列 锁的初识

Go基础之锁的初识 当我们的程序就一个线程的时候是不需要用到锁的&#xff0c;但是通常我们实际的代码不会是单个线程的&#xff0c;所有这个时候就需要用到锁了&#xff0c;那么关于锁的使用场景主要涉及到哪些呢&#xff1f; 当我们多个线程在读相同的数据的时候则是需要加锁…

Java 试题六

Java 试题六 1、Collection 和 Collections的区别 答&#xff1a;Collection是集合类的上级接口&#xff0c;继承与他的接口主要有Set 和List。Collections是针对集合类的一个帮助类&#xff0c;他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 2、Set里…

node --- 实现session认证.

跨域认证的问题 互联网服务离不开用户认证.一般流程如下: 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&#xff08;session&#xff09;里面保存相关数据&#xff0c;比如用户角色、登录时间等等。 3、服务器向用户返回一个 session_id&…

回信,我的好朋友王一涵

好了&#xff0c;不拖了&#xff0c;沏一杯咖啡&#xff0c;把信写完。因为再拿好吃的贿赂你&#xff0c;贿赂不起了—— 一个胖子可以吃穷我的。 王一涵凹&#xff0c;不得了不得了。微胖肉质女生&#xff0c;关于体重我就不提了&#xff0c;只有我知道嘿嘿嘿&#xff0c;在我…

编写基于Property-based的单元测试

编写基于Property-based的单元测试 作为一个开发者&#xff0c;你可能认为你的职责就是编写代码从而完成需求。我不敢苟同&#xff0c;开发者的工作是通过软件来解决现实需求&#xff0c;编写代码只是软件开发的其中一个方面&#xff0c;编写可靠的软件和产出有价值的代码更加重…

树链剖分+线段树 单点修改 区间求和 模板

马上要去西安打邀请赛了&#xff0c;存下板子 首先是vector存图的&#xff1a; #include<bits/stdc.h> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m1,r,rt<<1|1 #define mid int m (l r) >> 1 const int M …

koa --- seesion实现登录鉴权

koa vue session 实现一个简单的登录逻辑 /login component/login-session.html <!DOCTYPE html><head><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src"https://unpkg.com/axios/dist/axios.…

BZOJ2216: [Poi2011]Lightning Conductor

第一道此类的题&#xff0c;所以这是一篇假的博客&#xff0c;定理不会证明不理性 也不一定对 我是从这篇博客看的 很显然是让你求 p[i] max{a[j] sqrt(i - j)} - a[i] 就是 max{a[j] sqrt(|i - j|)} 这是一个 1D/1D 动态规划 考虑对于绝对值的情况不好做&#xff0c;那就…

HNOI2018游记

HNOI2018游记 day 0 上午稍微写了下题保持手感,然后看了一下套路,感觉不会的还是不会. 下午去划水在湖面上被吹成傻逼... 感觉没有联赛前那么紧张了,应该是联赛考挂了的原因吧.. day1 早上大概7:40就到了考场,和同学聊了一会儿天,看了看配置就进去了. 进去之后敲配置没有一遍对…

Java 试题七

Java 试题七 1、java中有几种类型的流&#xff1f;JDK为每种类型的流提供了一些抽象类以供继承&#xff0c;请说出他们分别是哪些类&#xff1f; 答&#xff1a;字节流&#xff0c;字符流。 字节流继承于InputStream、OutputStream&#xff0c; 字符流继承于Reader、Writer…

flume快速入门及应用

 Flume 简介 Flume 的安装与配置 Fumne 部署   Flume 是 Cloudera 提供的一个高可用、 高可靠、 分布式的海量日志采集、 聚合和传输的系统。 Flume 支持定制各类数据源如 Avro、 Thrift、 Spooling 等。 同时 Flume提供对数据的简单处理&#xff0c; 并将数据处理结果…

koa --- jwt实现最简单的Token认证

HTML 有如下html: 先看代码后挑重点来说明: <!DOCTYPE html><head><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src"https://unpkg.com/axios/dist/axios.min.js"></script></…