【问题标题】:JavaScript NodeJS Joi validation for large numbers用于大数字的 JavaScript NodeJS Joi 验证
【发布时间】:2019-12-01 20:58:27
【问题描述】:

我正在使用 Joi 验证库在 NodeJS 12 中创建一个应用程序来验证 API 请求正文。

我遇到了长度超过 16 位的数字数据类型的问题。

我想验证一个 18 位长的数字。

验证适用于较小的数字,但不适用于较大的数字。我认为这可能是由于数字大小的限制。

我无法关注selected answer in this similar question,因为该字段无法转换为字符串。它必须被处理并作为一个数字存储在数据库中。

示例值:

999830129121239112

Joi 验证规则

ExampleNumber: Joi.number().integer().max(999999999999999999).allow(null),

错误信息:

{"message":"'ExampleNumber' must be a safe number at body,ExampleNumber","field":"ExampleNumber"}

【问题讨论】:

    标签: node.js numbers joi


    【解决方案1】:

    您需要使用number.unsafe() 来验证大数,

    来自API doc

    const safeNumber = Joi.number();
    safeNumber.validate(90071992547409924);
    // error -> "value" must be a safe number
    
    const unsafeNumber = Joi.number().unsafe();
    unsafeNumber.validate(90071992547409924);
    // error -> null
    // value -> 90071992547409920
    

    【讨论】:

      【解决方案2】:

      JS 的 Number.MAX_SAFE_INTEGER 值等于 9007199254740991。因此,如果您在 JS 中使用大于此值的数字,那么您很可能会得到与预期不同的结果。例如,您的示例中的999830129121239112 在JS 中返回999830129121239200,因此如果您尝试将其保存到数据库中,则会出错。

      表示如果您打算在 JS 中使用如此大的数字,您必须使用另一种类型,即 StringBigInt(从 Node v10.4 开始,也不支持所有浏览器 - 检查here)

      但正如我所见,BigInt 类型支持尚未在 Joi 中实现(从这个已关闭的问题来看:https://github.com/hapijs/joi/issues/1531)所以我猜String 是您的选择。

      在JS中将值存储为字符串没有关系,如果该列是数字类型,则在将其保存到DB时仍然会转换为数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 2020-01-19
        • 2020-06-04
        • 2022-01-25
        • 1970-01-01
        • 2017-07-28
        • 2021-02-05
        相关资源
        最近更新 更多