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)
您需要使用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)
JS 的Number.MAX_SAFE_INTEGER值等于9007199254740991. 因此,如果您在 JS 中使用大于此值的数字,那么您很可能会得到与预期不同的结果。例如,999830129121239112在您的示例中999830129121239200以 JS返回,因此如果您尝试将其保存到您的数据库中,它将是错误的。
意味着如果你打算在 JS 中使用这么大的数字,你必须使用另一种类型,即String或BigInt(从 Node v10.4 开始,也不是所有浏览器都支持 - 检查这里)
但是正如我所看到的BigInt,Joi 中尚未实现类型支持(从这个已关闭的问题来看:https : //github.com/hapijs/joi/issues/1531)所以我想这String是您的选择。
JS中以字符串形式存储也没有关系,如果列是数字类型,保存到DB时还是会转成数字。
| 归档时间: |
|
| 查看次数: |
3764 次 |
| 最近记录: |