【node.js】第三方模块joi报错 UnhandledPromiseRejectionWarning: TypeError: Joi.validate is not a function

joi介绍

joi是node.js的第三方模块,用来验证前端提交插入数据库的格式,首先在Joi内部定义好了许多验证规则,并提供语法让你将不同的规则组合起来,形成符合你的验证规则。然后使用这个规则来验证你想要验证的对象是否符合要求

原因

// 文章分类格式校验
const validateDemos = Demos => {
    // 定义对象验证规则
    const schema = {
        title: Joi.string().required().error(new Error('标题不符合规则')),
        content: Joi.string().required().error(new Error('内容不符合规则')),
        url: Joi.string().required().error(new Error('链接地址非法')),
        Priority: Joi.number().valid(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10).error(new Error('优先级不符合规则')),
        cover: Joi.string().error(new Error('封面不符合规则'))
    };
    // 验证
    return Joi.validate(Demos, schema, {
        // 检测到所有错误
        abortEarly: false,
        // 允许对象包含被忽略的未知键
        allowUnknown: true
    });

}

版本原因,我使用的是14.0.6版本的Joi.validate方法,现如今高版本的joi已经不支持该方法

即,直接使用npm install joi安装的模块将会出现UnhandledPromiseRejectionWarning: TypeError: Joi.validate is not a function错误

解决方法

1.降低版本

使用npm install joi@14.0.6语法规定指定版本,下载低版本joi即可继续使用Joi.validate方法

2.使用新语法

新版本joi使用Joi模块的object方法生成验证规则,而不是直接将一个对象作为验证规则

const schema = Joi.object({
    a: Joi.string()
});

用于验证的validate方法位于使用object返回的对象中

const { error, value } = schema.validate({ a: 'a string' });

例子:

const Joi = require('joi');

const schema = Joi.object({
    username: Joi.string()
        .alphanum()
        .min(3)
        .max(30)
        .required(),

    password: Joi.string()
        .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),

    repeat_password: Joi.ref('password'),

    access_token: [
        Joi.string(),
        Joi.number()
    ],

    birth_year: Joi.number()
        .integer()
        .min(1900)
        .max(2013),

    email: Joi.string()
        .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
})
    .with('username', 'birth_year')
    .xor('password', 'access_token')
    .with('password', 'repeat_password');


schema.validate({ username: 'abc', birth_year: 1994 });
// -> { value: { username: 'abc', birth_year: 1994 } }

schema.validate({});
// -> { value: {}, error: '"username" is required' }

// Also -

try {
    const value = await schema.validateAsync({ username: 'abc', birth_year: 1994 });
}
catch (err) { }

学习新语法

高版本的joi已经不在使用Joi.validate方法验证规则了,随着时间推移低版本将会被淘汰,前往官网查看新语法

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值