物流中枢一定会遇到异常件:
- 运单不存在
- 包裹超重
- 车辆没有通行证
- 仓区内部故障
Fastify 的错误处理有两层:
#1. 在业务工位里主动抛错
fastify.get('/shipments/:id', async function (request, reply) {
const id = request.params.id
if (id !== 'S1001') {
reply.code(404)
throw new Error('包裹不存在')
}
return { id, status: 'found' }
})#2. 在中枢级别统一收异常件
fastify.setErrorHandler(function (error, request, reply) {
request.log.error({ err: error }, 'shipment failed')
if (reply.statusCode < 400) {
reply.code(500)
}
reply.send({
ok: false,
message: error.message,
traceId: request.id
})
})#onError 和 setErrorHandler 的区别
onError
└── 更像“异常件监控岗”
└── 适合记录、附加信息,不适合改业务错误本体
setErrorHandler
└── 更像“异常件统一处置中心”
└── 适合决定最终返回给客户什么再记一个稳定规则:
- 要抛就抛
Error实例 - 不要
throw 'bad'这种字符串
这样错误传播链才稳定。