Nodejs中大家怎么在service处理验证失败的信息?
Nodejs中大家怎么在service处理验证失败的信息?
比如说注册用户用户名已存在之类的,这种信息怎么比较优雅的处理?
目前是 throw new Error(), 然后再 controller 层 try catch
也有些情况下抛错需要携带一些上下文一并返回,就返回一个特定的数据结构比如 success 啥的,在 controller 层判断
抛出特定异常,然后统一异常处理
我的处理和楼上不同,不抛出异常,直接返回一个错误信息。
{
“success”: false,
“code”: 400,
“message”: “用户名已存在”,
“data”: null,
“option”: null
}
service 抛出自定义异常,然后框架统一处理异常
自定义一个通用的项目异常,然后写一个全局异常捕获处理器,处理器统一返回和接口同结构的 JSON 错误结果.
service 中主动抛出自定义异常即可. 如: throw new ProjectException(“验证身份失败”);
抛出的异常会被处理器捕获,然后返回 {“code”:500, “message”:“验证身份失败”, data: null}
理论上, 抛出的可以是一个枚举,枚举包含一个错误码和一条错误信息
throw
服务端统一开辟一个 API 处理层,请求发进来先进入这个层,用于校验参数格式、调用底层业务逻辑、组合和格式化返回数据。
对于注册时用户是否存在的问题,是在注册过程的事务中进行,确保用户不存在、创建用户为原子操作,一旦操作失败,可以 throw error,在 API 处理层 catch 这个 error,然后再组合好适当的信息和状态码返回给客户端。
如果业务足够轻,不值得单独开辟一个 API 处理层,希望从 controller 层直接配置好 HTTP 状态码和返回信息,可以使用 http-error 或 http-assert 包来自动 throw error,并携带 HTTP 状态码和返回数据,然后在 API 路由上全局捕捉 error,直接把 http-error 携带的状态码和返回信息返回给客户端。
koa.js 内置了 http-assert/http-error 机制,http-assert 的所有方法都可以直接从 ctx ( Context )中调用。
通用异常拦截器 + DTO pipe + controller 层 DTO 参数验证
在Node.js中处理验证失败的信息,通常会在service层进行逻辑处理,并通过抛出自定义错误或返回错误对象的方式,将错误信息传递给上层调用者(如控制器层)。以下是一个简单的示例,展示如何在service层处理验证失败的信息:
// validation.js - 验证函数
function validateInput(data) {
const errors = [];
if (!data.name) errors.push('Name is required');
if (!data.age || data.age < 0 || data.age > 120) errors.push('Invalid age');
if (errors.length > 0) {
const validationError = new Error('Validation failed');
validationError.status = 400; // 设置HTTP状态码
validationError.errors = errors; // 附加错误信息
throw validationError;
}
}
// userService.js - 服务层函数
async function createUser(data) {
try {
validateInput(data); // 调用验证函数
// 如果验证通过,继续处理(如存储用户信息)
console.log('User data is valid:', data);
} catch (error) {
// 捕获并返回错误信息
return { error: error.message, details: error.errors, status: error.status };
}
}
// 调用示例
createUser({ name: '', age: -5 }).then(result => console.log(result));
在这个示例中,validateInput函数负责验证输入数据,并在验证失败时抛出一个包含错误信息的自定义错误。createUser函数在捕获到这个错误后,将其错误信息格式化并返回。这种方式有助于在Node.js应用中统一处理验证失败的情况。

