【发布时间】:2019-12-14 03:59:57
【问题描述】:
我有以下规则:Joi.string().empty("").default(null)。
我认为这条规则会将空字符串 "" 转换为 null,但事实并非如此。
如何获得所需的行为?
【问题讨论】:
我有以下规则:Joi.string().empty("").default(null)。
我认为这条规则会将空字符串 "" 转换为 null,但事实并非如此。
如何获得所需的行为?
【问题讨论】:
我看不出有什么问题。我从提供的架构中获得了所需的行为:
const Joi = require('@hapi/joi');
const joiSchema = Joi.string().empty('').default(null);
const { error, value } = joiSchema.validate();
console.log(`error: ${error}`, `value: ${value}`);
输出:
"error: undefined"
"value: null"
确保您使用的是最新版本。在 RunKit 检查工作代码:https://runkit.com/rvypandey/5e387545896365001a90a87b
【讨论】:
"" 所需的行为
Joi, convert empty string to null。此外,描述也是如此。我提供了 sn-p 来验证 + 转换(使用默认值)
如果将规则应用于非必填字段,则略有不同。
使用empty(""):如果请求提供""作为值,它将被替换为undefined。
使用default(null):表示如果值为undefined,它将被替换为null - 请注意,如果请求中根本没有提供任何值,它也将是undefined。
因此您的示例将接受任何字符串,但如果值为"",它将被替换为undefined,如果值为undefined,它将被替换为null。
因此,每个请求的值将始终为null,除非提供了""以外的字符串。
如果您希望在请求未提供任何值时保持undefined 的值,您需要类似:
Joi.alternatives()
.try(
Joi.string().valid('').empty('').default(null), // accept only empty strings and convert those to null
Joi.string() // accept every other string
)
这样,如果请求值是一个字符串,它将被接受,除非它是"",否则它将被转换为null。否则,如果请求没有为该字段提供任何值,则该值将保持为undefined。
【讨论】: