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

26 篇文章 1 订阅

说明

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

构造错误

  • 本栗采用调用一个不存在的函数来抛出错误
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;
})

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

  • 注: 后台直接挂掉.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值