JavaScript NodeJS Joi 大量验证

JavaScript NodeJS Joi validation for large numbers

我正在使用 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"}

您需要使用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

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

意味着如果你打算在 JS 中使用如此大的数字,你 必须 使用另一种类型,即 StringBigInt (开始节点v10.4,也并非所有浏览器都支持 - 检查 here)

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

在JS中存为字符串无所谓,如果是number类型,存到DB时还是会转成数字