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

Joi自定义验证器未执行:如何将空字符串字段转为null?

问题

当字段name的值为空字符串('')时,希望Joi Schema返回null,但自定义验证器逻辑未运行。发现当键值为空字符串时,自定义验证器不会执行,该如何解决?

代码示例:

const Joi = require('joi');

const schema = Joi.object()
  .keys({
    name: Joi.string().optional().trim().allow(null, '').custom((value, helpers) => {
      console.log('-------------------', value)
      if (value === '') {
        return null;
      }
      return value;
    }),
  });

// 运行步骤
const input = {
  name: '', // 空字符串
};

const result = schema.validate(input);
console.log(input, result.value);
// 预期输出: {name: null}
// 实际输出: {name: ''}

原因

Joi的allow(null, '')会将空字符串和null标记为合法值,直接跳过后续所有验证/转换逻辑(包括custom验证器),因此你的自定义转换代码不会被执行。

解决方案

方法1:调整规则顺序

将allow移到custom之后,这样自定义逻辑会先执行,再标记值为合法:

const Joi = require('joi');

const schema = Joi.object()
  .keys({
    name: Joi.string().optional().trim()
      .custom((value, helpers) => {
        if (value === '') {
          return null;
        }
        return value;
      })
      .allow(null, ''), // 移到custom之后
  });

const input = { name: '' };
const result = schema.validate(input);
console.log(result.value); // 输出: { name: null }

方法2:使用transform(推荐)

transform是Joi专门用于值转换的API,比custom更适合这类场景,且不受allow的执行顺序影响:

const Joi = require('joi');

const schema = Joi.object()
  .keys({
    name: Joi.string().optional().trim().allow(null, '')
      .transform((value) => {
        return value === '' ? null : value;
      }),
  });

const input = { name: '' };
const result = schema.validate(input);
console.log(result.value); // 输出: { name: null }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:31:07