V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KouShuiYu
V2EX  ›  Node.js

大家怎么在 service 处理验证失败的信息?

  •  
  •   KouShuiYu · 2020-10-10 19:29:46 +08:00 · 3539 次点击
    这是一个创建于 1265 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说注册用户用户名已存在之类的,这种信息怎么比较优雅的处理?
    8 条回复    2020-10-16 14:58:15 +08:00
    rbe
        1
    rbe  
       2020-10-10 20:12:34 +08:00
    目前是 throw new Error(), 然后再 controller 层 try catch
    也有些情况下抛错需要携带一些上下文一并返回,就返回一个特定的数据结构比如 success 啥的,在 controller 层判断
    dethan
        2
    dethan  
       2020-10-10 20:15:19 +08:00 via Android
    抛出特定异常,然后统一异常处理
    xuanbg
        3
    xuanbg  
       2020-10-10 20:30:44 +08:00
    我的处理和楼上不同,不抛出异常,直接返回一个错误信息。
    {
    "success": false,
    "code": 400,
    "message": "用户名已存在",
    "data": null,
    "option": null
    }
    youngxhui
        4
    youngxhui  
       2020-10-10 20:50:44 +08:00
    service 抛出自定义异常,然后框架统一处理异常
    lyusantu
        5
    lyusantu  
       2020-10-10 22:14:55 +08:00
    自定义一个通用的项目异常,然后写一个全局异常捕获处理器,处理器统一返回和接口同结构的 JSON 错误结果.

    service 中主动抛出自定义异常即可. 如: throw new ProjectException("验证身份失败");

    抛出的异常会被处理器捕获,然后返回 {"code":500, "message":"验证身份失败", data: null}

    理论上, 抛出的可以是一个枚举,枚举包含一个错误码和一条错误信息
    huijiewei
        6
    huijiewei  
       2020-10-10 23:04:23 +08:00 via iPhone
    throw
    libook
        7
    libook  
       2020-10-12 12:33:05 +08:00
    服务端统一开辟一个 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 )中调用。
    chogath
        8
    chogath  
       2020-10-16 14:58:15 +08:00
    通用异常拦截器 + DTO pipe + controller 层 DTO 参数验证
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1147 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:36 · PVG 02:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.