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赋值会报错,有什么方法可以使用统一的错误处理吗

阅读 2k
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 */) /* , ... */);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进