如何捕获Prisma交互式事务的错误?
捕获Prisma异常并避免应用崩溃
1. 用try/catch包裹Prisma操作
直接在调用Prisma数据库方法的代码块外层添加try/catch,确保异常被拦截而不扩散到应用全局:
async function getSingleUser(userId) { try { return await prisma.user.findUnique({ where: { id: userId } }); } catch (error) { // 转交给专门的错误处理逻辑 return handleDbError(error); } }
2. 针对性处理Prisma异常类型
Prisma定义了明确的错误分类,可根据类型和内置错误码做精细化处理:
function handleDbError(error) { // 已知请求错误(如唯一约束冲突、目标记录不存在) if (error instanceof Prisma.PrismaClientKnownRequestError) { switch (error.code) { case 'P2002': console.error('唯一字段重复:', error.meta.target); return { success: false, msg: '该资源已存在' }; case 'P2025': console.error('请求的记录不存在'); return { success: false, msg: '资源未找到' }; default: console.error('数据库请求错误:', error.message); return { success: false, msg: '数据库操作失败' }; } } // 数据验证错误(字段类型不匹配、必填项缺失) else if (error instanceof Prisma.PrismaClientValidationError) { console.error('数据格式错误:', error.message); return { success: false, msg: '输入格式不符合要求' }; } // 其他未知异常兜底 else { console.error('未知数据库异常:', error); return { success: false, msg: '服务器异常' }; } }
3. 全局异常兜底(Web应用场景)
如果是Express类Web框架,可添加全局错误中间件,捕获所有未被局部处理的异常:
// Express全局错误处理中间件 app.use((err, req, res, next) => { if (err instanceof Prisma.PrismaClientKnownRequestError) { let status = 500; let msg = '服务器错误'; if (err.code === 'P2002') { status = 409; msg = '资源已存在'; } else if (err.code === 'P2025') { status = 404; msg = '资源未找到'; } res.status(status).json({ success: false, msg }); } else { res.status(500).json({ success: false, msg: '服务器异常' }); } });
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

