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方法验证规则了,随着时间推移低版本将会被淘汰,前往官网查看新语法