Joi验证异常:调用keys()后必填数字非零规则失效
问题原因及解决方案
核心问题
你代码里的.keys()调用是问题根源。Joi的keys()方法如果不传参数,会直接清空之前通过Joi.object({ ... })定义的所有属性校验规则,相当于把你的schema重置成了一个允许未知属性的空对象——这就解释了为什么ans:0或者字符串类型的ans都能通过校验:因为根本没规则在约束它。
解决方案
直接移除多余的.keys()即可,Joi.object({ ... })已经完成了属性规则的定义,.unknown(true)直接链式调用在后面就好:
import * as Joi from 'joi'; const joiSchema= Joi.object({ ans: Joi.number().required().not(0), }).unknown(true); // 去掉空调用的.keys() const data = { ans: 0, }; async function validateData() { try { const value = await joiSchema.validateAsync(data); console.log('Validation succeeded:', value); } catch (err) { console.error('Validation error:', err); // 现在会正确抛出"ans must not be 0"的错误 } } validateData();
额外说明
如果之后需要给schema追加新的属性规则,不要用空的keys(),改用.append()方法:
// 示例:追加新字段规则 const joiSchema= Joi.object({ ans: Joi.number().required().not(0), }).unknown(true).append({ username: Joi.string().min(3).required() });
内容的提问来源于stack exchange,提问作者Mayank Kakkar
相关产品推荐
相关产品推荐

