koa使用joi进行数据校验,进行统一错误处理的时候报错TypeError: Cannot set properties of undefined (setting 'body'),请问如何解决?

// 统一的错误处理
app.on('error', errHandler)

// 简单的错误处理
const errHandler = (err: any, ctx: Context) => {
  ctx.body = err
  console.log('errHandler --->:', err)
}
// 封装的校验器
export const validator = (schema) => {
  return async (ctx: Context, next) => {
    try {
      const { error } = await schema.validateAsync(ctx.request.body)
      if (error) {
        throw error
      }
      await next()
    } catch (error: any) {
     // formatError 返回错误信息的函数
      ctx.app.emit('error', formatError('数据格式错误', error.details, 0))
      // ctx.body = {
      //   code: 0,
      //   message: '数据格式错误',
      //   result: error.details
      // }
    }
  }
}

在这里直接使用ctx.body返回可以,但是使用ctx.app.emit()中的ctx.body赋值会报错,有什么方法可以使用统一的错误处理吗

阅读 2.1k
1 个回答

可以直接用中间件来处理错误情况,没必要去挂接error事件;(报错可能是事件并没有提供第二个参数ctx)

改用中间件处理

// 封装的校验器
export const validator = (schema) => {
  return async (ctx: Context, next) => {    
      const { error } = await schema.validateAsync(ctx.request.body)
      if (error) {
        throw error
      }
      await next()
  }
}
// ...

app.use(async (ctx, next) => {
    try {
        await next();
    } catch (error) {
        //ctx.status = 500;
        ctx.body = error;
    }
});

app.use(validator(/* schema */) /* , ... */);