本文共 2180 字,大约阅读时间需要 7 分钟。
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方法验证规则了,随着时间推移低版本将会被淘汰,
转载地址:http://gnuzi.baihongyu.com/