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 时可以保持统一的错误语义。