koa 错误处理相关

异常状况有哪些?

运行时错误, 都返回 500

运行时错误, 是建立在语法没有错的基础上, 而是运行时错误.
比如: 求 undefined 的某属性,
但是都知道,只有对象才有属性, 所以求 undefined 的属性就会出现运行错误. 这种都是 500 错误

逻辑错误, 如找不到(404), 先决条件失败(412), 无法处理的实体(参数格式不对, 422)等

404: 找不到某网页, 某接口等
412: 请求某 id 不存在等
422: 请求体里的参数格式不对, 无法处理等
4 开头的大部分都是逻辑错误

为什么要用错误处理?

  • 防止程序 down 掉
  • 告诉用户错误信息
  • 便于开发者调试

javascript 中错误处理的语法就是 try…catch
koa 自带的错误处理也是 try…catch 实现的, 里面的源码是 catch 了一个 promise

koa 自带的错误处理

自动处理 404, 412, 500 等
但是目前对于 RESTful api 的错误还是有局限,
因为在 RESTful api 里我们期望所有的返回值都必须为 json, 而 koa 目前报错返回文本
对于客户端使用起来不方便.

那么如何让其返回 json 格式的呢? 可以用中间件

自己编写错误处理中间件

错误处理跟中间件的关系:
在 koa 中如果想自定义错误处理的逻辑, 那么就是编写一个中间件, 并把这个中间件放在所有中间件的链条的最前面, 然后使用 try catch 语法, 把 next 函数放在 try 里面, 这样就可以捕获后面所有中间件里面的错误信息

app.use(async (ctx,next) => {
    
    
  try {
    
    
    await next();
  } catch (err) {
    
    
    ctx.status = err.status || err.statusCode;
    ctx.body = {
    
    
      message: err.message
    }
  }
})

可以捕获手动抛出的信息以及运行时报错信息而且是 json 格式,
优化了 koa 默认的错误处理,但是404 错误目前捕捉不到

使用 koa-json-error 进行错误处理

这个中间件专门为纯 json 应用准备的
上面自定义的错误处理中间件, 无法处理 404 错误,并且实际工作场景不需要自己手动写, 社区中可以使用这些现成的

安装 koa-json-error并引用
npm i koa-json-error --save
const error = require('koa-json-error')

使用 koa-json-error 的默认配置处理错误
app.use(error());

修改配置使其在生产环境下禁用错误堆栈的返回
因为生产环境返回那么多字段给客户有安全隐患,所以要修改配置
比如让生产环境不返回 stack, 在开发环境返回:
通常生产环境有个环境变量 production, 
所以检测该环境变量

app.use(error({
    
    
  postFormat:(e, {
    
    stack, ...rest}) => process.env.NODE_ENV === 'production' ? rest : {
    
    stack, ...rest}
}));

使用 koa-parameter 校验参数

有种逻辑错误叫做不能处理的实体, 通常是参数格式不对导致的, 参数通常都是请求体.
那么如何校验参数, 可以把每个参数手动校验, 但是不现实
因此优雅校验可以使用这个中间件

npm i koa-parameter --save

注册:
const parameter = require('koa-parameter');

因为通常是校验请求体的, 所以放在 app.use(bodyparser())后面更好
app.use(parameter(app));
为什么传 app 进去?
因为这个中间件还有个功能, 它可以在 ctx 也就是上下文中加上一个方法校验, 就可以全局的使用了

假设创建用户中间件中校验, 把下面这段自定义的校验规则放到对应接口的中间件中
ctx.verifyParams({
    
    
  name: {
    
     type:'string', required:true },
  age: {
    
    type:'number', require:false}
})
这样在创建用户的请求体中就会进行校验, 如果不满足就返回 422 状态码以及信息给客户端

猜你喜欢

转载自blog.csdn.net/m0_48446542/article/details/109120428
koa