大数字的 JavaScript NodeJS Joi 验证

pen*_*ngz 4 numbers node.js joi

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

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

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

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

我无法遵循此类似问题中选定答案,因为该字段无法转换为字符串。它必须被处理并作为一个数字存储在数据库中。

示例值:

999830129121239112
Run Code Online (Sandbox Code Playgroud)

Joi 验证规则

ExampleNumber: Joi.number().integer().max(999999999999999999).allow(null),
Run Code Online (Sandbox Code Playgroud)

错误信息:

{"message":"'ExampleNumber' must be a safe number at body,ExampleNumber","field":"ExampleNumber"}
Run Code Online (Sandbox Code Playgroud)

Ari*_*rty 6

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

来自API 文档

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
Run Code Online (Sandbox Code Playgroud)


GPr*_*ost 6

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

意味着如果你打算在 JS 中使用这么大的数字,你必须使用另一种类型,即StringBigInt(从 Node v10.4 开始,也不是所有浏览器都支持 - 检查这里

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

JS中以字符串形式存储也没有关系,如果列是数字类型,保存到DB时还是会转成数字。