【问题标题】:Joi, convert empty string to nullJoi,将空字符串转换为null
【发布时间】:2019-12-14 03:59:57
【问题描述】:

我有以下规则:Joi.string().empty("").default(null)

我认为这条规则会将空字符串 "" 转换为 null,但事实并非如此。

如何获得所需的行为?

【问题讨论】:

    标签: node.js joi


    【解决方案1】:

    我看不出有什么问题。我从提供的架构中获得了所需的行为:

    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

    【讨论】:

    • 这个 sn-p 根本没有验证任何内容,但问题指定了验证空字符串 "" 所需的行为
    • 问题的标题本身指定了转换 - Joi, convert empty string to null。此外,描述也是如此。我提供了 sn-p 来验证 + 转换(使用默认值)
    【解决方案2】:

    如果将规则应用于非必填字段,则略有不同。

    使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多