You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:32:42