Skip to content

Repository 异常处理与日志策略

底层位置:app/repository/base/BaseStandardRepository.js_handleError_logOperation。作用:在 MongoDB/MariaDB 双适配器下提供统一的错误包装、上下文日志与业务异常转换。

TL;DR

  • _handleError 会记录日志(含 operation/data/entityName/stack),并用 ErrorFactory.fromOriginalError 转为业务异常后抛出
  • 开启 config.repository.logging=true 后,_logOperation 会输出每次操作的 data/result/timestamp,便于排查
  • 子类可重写 _validateData_customPreprocessForCreate/Update 预防错误,把数据问题拦在入库前

实战示例

js
async createOne(data) {
  try {
    const validated = this._validateData(data, 'create');
    if (!validated.valid) {
      throw new Error(validated.errors.join('; '));
    }
    const payload = this._mapIdToDatabase(this._preprocessDataForCreate(data));
    const saved = await this.adapter.create(payload);
    this._logOperation('create', data, saved);
    return this._postprocessData(saved);
  } catch (error) {
    return this._handleError(error, 'create', { id: data?.id, data });
  }
}

设计要点

  • 上下文化错误_handleError 会带上 operation/resource/id/field,让 API 层能输出可读的业务错误。
  • 日志落地:有 app.logger 时写入框架日志;否则回退到 console.error,保证排查信息不中断。
  • 钩子链:在 _preprocessDataForCreate/_customPreprocessForCreate 等钩子做数据清洗、默认值补齐,减少数据库约束报错。
  • 兼容双库:ErrorFactory 会对底层错误进行归一化,切换 MongoDB/MariaDB 时可以保持统一的错误语义。

内链建议

最后更新于: