Mongoose 数据校验
什么是mongoose数据校验
用户通过mongoose给mongodb数据库增加数据的时候,对数据的合法性进行的验证
mongoose里面定义Schema:字段类型,修饰符、默认参数 、数据校验都是为了数据库数据的一致性
Schema,为数据库对象的集合,每个schema会映射到mongodb中的一个collection,定义Schema可以理解为表结构的定义
Mongoose内置的校验参数
代码演示,首先还是有个db.js(用于连接数据库)和users.js(操作users集合的schema模块)还有app.js
const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/eggcms', { useNewUrlParser: true }, (err) => { if(err){ return console.log(err); } console.log('数据库连接成功') }); module.exports = mongoose
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String }, age: { type: Number }, status: { type: Number, default: 1 } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ age: 23 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
required: 表示这个数据必须传入,可以用在任意类型数据
比如再schema中将name字段设置为required:true,当我添加数据的时候没有name字段就会报错
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String, required: true }, age: { type: Number }, status: { type: Number, default: 1 } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ age: 23 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 23 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
max: 用于 Number 类型数据,最大值
比如将age的max设置为100,当我增加数据的时候,如果status的字段大于100就会报错(添加不成功),如果小于等于100就可以添加成功
min: 用于 Number 类型数据,最小值
比如将age的max设置0,当我增加数据的时候,如果status的字段小于0就会报错(添加不成功),如果大于等于0就可以添加成功
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String, required: true, maxlength: 10 }, age: { type: Number, max: 100, min: 0 }, status: { type: Number, default: 1 } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 101 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
当新增一个数据age字段大于100,报错了
enum:枚举类型,要求数据必须满足枚举值 enum:['0','1','2'],必须用在String的数据类型中
比如:新增数据的时候status字段的值必须是[0,1,2]中的其中一个
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String, required: true, maxlength: 10 }, age: { type: Number, max: 100, min: 0 }, status: { type: String, default: '1', enum: ['0', '1', '2'] } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 100, status: '4' }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
match:增加的数据必须符合 match(正则)的规则,适用于String类型
表示增加的数据必须满足这个正则才会添加成功,比如必须是合法的手机号码
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String, required: true, maxlength: 10 }, age: { type: Number, max: 100, min: 0 }, status: { type: String, default: '1', enum: ['0', '1', '2'] }, phone:{ type: String, match: /^1[3|4|5|7|8][0-9]\d{8}$/ } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
当我新增一条数据phone字段是一个合法的手机号码,结果显示添加成功,并且将我数据的手机号码是Number类型自动转成String类型
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 100, status: '2', phone: 13824360121 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
当我新增一条数据phone字段不是合法的手机号码,就报错了
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 100, status: '2', phone: 138243601211 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
maxlength:最大长度
minlength:最小长度
Mongoose 自定义的验证器
Mongoose中除了内置的校验参数,还可以自定义校验,使用validate来定义一个方法校验,如果通过验证返回 true,并且新增成功,没有通过则返回 false,新增失败
需求:定义一个字段desc,长度必须大于或等于10(数据类型可以是String和Number)
let mongoose = require('./db') let UserSchema = mongoose.Schema({ name: { type: String, required: true, maxlength: 10 }, age: { type: Number, max: 100, min: 0 }, status: { type: String, default: '1', enum: ['0', '1', '2'] }, phone:{ type: String, match: /^1[3|4|5|7|8][0-9]\d{8}$/ }, desc:{ type:String, validate: (desc) => { return desc.length >= 10; } } }) // 定义model操作数据库 let UserModel = mongoose.model('User',UserSchema,'users'); module.exports = UserModel
当我新增数据的时候,desc如果长度小于10就会报错
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 100, status: '2', phone: 13824360121, desc: '123' }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })
当我新增一个长度大于或者等于10的数据就成功了
let UserModel = require('./model/users') // 增加数据 let u = new UserModel({ name: '王五', age: 100, status: '2', phone: 13824360121, desc: 1234567890 }) u.save((err) => { if (err) { console.log(err) return } console.log('增加数据成功') // 查询users表的数据 UserModel.find({}, (err, doc) => { if (err) { console.log(err) return } console.log(doc) }) })