Node.js+Prisma项目:如何处理错误并向客户端返回有效提示?
首先修正代码中的拼写错误:将primsa改为prisma,然后通过try-catch捕获错误,并针对PrismaClientValidationError提取核心的参数错误信息。
修改后的完整代码
router.post("/abc", async (req, res) => { try { const data = req.body; // 修正拼写错误:primsa → prisma const resp = await prisma.tableName.create({ data }); res.status(200).send({ message: "Success", resp }); } catch (err) { // 处理参数验证错误 if (err instanceof Prisma.PrismaClientValidationError) { // 用正则提取从"Argument"开始的核心错误内容 const errorContent = err.message.match(/Argument .+/s)?.[0] || "参数格式验证失败"; res.status(400).send({ message: errorContent }); } else { // 处理其他类型错误 res.status(500).send({ message: "服务器内部错误" }); } } });
关键逻辑说明
- 用
try-catch包裹异步操作,确保错误能被捕获处理 - 通过
instanceof判断错误类型,精准处理PrismaClientValidationError - 正则表达式
/Argument .+/s:Argument .+匹配以"Argument"开头的内容s修饰符让.匹配换行符,确保能捕获完整的参数错误说明(包括后续的类型定义)- 可选链
?.和默认值避免匹配失败时出现异常
效果示例
对于你提供的错误信息,提取后返回给客户端的内容为:
Argument user: Got invalid value '2' on prisma.createTableName. Provided String, expected usersCreateNestedOneWithouttableNameInput:
type usersCreateNestedOneWithoutTableNameInput {
create?: usersCreateWithoutTableNameInput | usersUncheckedCreateWithoutTableNameInput
connectOrCreate?: usersCreateOrConnectWithoutTableNameInput
connect?: usersWhereUniqueInput
}
如果只需要提取到第一行的错误描述,可以将正则改为/Argument .+?(?=\n)/,提取结果为:
Argument user: Got invalid value '2' on prisma.createTableName. Provided String, expected usersCreateNestedOneWithouttableNameInput:
内容的提问来源于stack exchange,提问作者J Sai Naveen

