You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Malli中malli.error/humanize的概念及具体作用是什么

malli.error/humanize 功能说明

直接给明确结论:

  • 它的核心作用是将Malli校验生成的原始错误数据转换为易读格式的输出工具,不是Java中那种专门用来注册自定义错误语句的机制。
  • 自定义错误文案是在Schema定义阶段通过配置项完成的,humanize属于错误处理链路的末端渲染层,负责把所有校验错误(包括内置默认错误、用户自定义错误)整理成和原数据结构对齐、无冗余内部字段、文案直白的结果,方便直接用来做表单提示、接口错误返回等面向用户的场景。

示例逻辑对应

你提供的代码刚好能印证它的作用,整个执行链路分三步:

  1. m/explain 对传入的Address结构做全量校验,这一步返回的原始结果包含大量机器处理用的内部字段,比如错误路径编码、校验器标识、Schema元数据等,结构复杂不适合直接展示。
  2. me/humanize 接收到原始校验结果后,会自动完成三个处理:
    • 错误位置和原数据结构完全对齐,比如嵌套在:address下的:city字段错误、:lonlat数组第二个元素的错误,输出层级和输入数据完全一致,不需要额外做路径映射
    • 将内部错误标识转换为直白的自然语言文案,比如把缺失必填键的内部标识转换为"missing required key",把类型不匹配的内部标识转换为"should be a double"
    • 过滤所有用户不需要感知的内部元数据,只保留可读的错误内容
  3. 最终输出的结果可以直接用于前端错误展示,不需要额外做格式转换。

补充说明:如果需要自定义错误提示文案,只需要在定义对应Schema时通过:message配置即可,humanize会自动读取配置的自定义文案输出,不需要修改humanize本身的逻辑。

对应示例代码:

(require '[malli.error :as me])

(-> Address
    (m/explain
      {:id "Lillan"
       :tags #{:artesan "coffee" :garden}
       :address {:street "Ahlmanintie 29"
                 :zip 33100
                 :lonlat [61.4858322, nil]}})
    (me/humanize))
;{:tags #{["should be a keyword"]}
; :address {:city ["missing required key"]
;           :lonlat [nil ["should be a double"]]}}

内容的提问来源于stack exchange,提问作者Blaze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:09:25