什么是mongoose数据校验

用户通过mongoose给mongodb数据库增加数据的时候,对数据的合法性进行的验证

mongoose里面定义Schema:字段类型,修饰符、默认参数 、数据校验都是为了数据库数据的一致性

Schema,为数据库对象的集合,每个schema会映射到mongodb中的一个collection,定义Schema可以理解为表结构的定义

Mongoose内置的校验参数

代码演示,首先还是有个db.js(用于连接数据库)和users.js(操作users集合的schema模块)还有app.js

  1. const mongoose = require('mongoose');
  2.  
  3. mongoose.connect('mongodb://127.0.0.1:27017/eggcms', { useNewUrlParser: true }, (err) => {
  4. if(err){
  5. return console.log(err);
  6. }
  7. console.log('数据库连接成功')
  8. });
  9.  
  10. module.exports = mongoose
  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String
  6. },
  7. age: {
  8. type: Number
  9. },
  10. status: {
  11. type: Number,
  12. default: 1
  13. }
  14. })
  15.  
  16. // 定义model操作数据库
  17. let UserModel = mongoose.model('User',UserSchema,'users');
  18.  
  19. module.exports = UserModel
  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. age: 23
  6. })
  7. u.save((err) => {
  8. if (err) {
  9. console.log(err)
  10. return
  11. }
  12. console.log('增加数据成功')
  13.  
  14. // 查询users表的数据
  15. UserModel.find({}, (err, doc) => {
  16. if (err) {
  17. console.log(err)
  18. return
  19. }
  20. console.log(doc)
  21. })
  22. })

required: 表示这个数据必须传入,可以用在任意类型数据

比如再schema中将name字段设置为required:true,当我添加数据的时候没有name字段就会报错

  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String,
  6. required: true
  7. },
  8. age: {
  9. type: Number
  10. },
  11. status: {
  12. type: Number,
  13. default: 1
  14. }
  15. })
  16.  
  17. // 定义model操作数据库
  18. let UserModel = mongoose.model('User',UserSchema,'users');
  19.  
  20. module.exports = UserModel
  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. age: 23
  6. })
  7. u.save((err) => {
  8. if (err) {
  9. console.log(err)
  10. return
  11. }
  12. console.log('增加数据成功')
  13.  
  14. // 查询users表的数据
  15. UserModel.find({}, (err, doc) => {
  16. if (err) {
  17. console.log(err)
  18. return
  19. }
  20. console.log(doc)
  21. })
  22. })

  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 23
  7. })
  8. u.save((err) => {
  9. if (err) {
  10. console.log(err)
  11. return
  12. }
  13. console.log('增加数据成功')
  14.  
  15. // 查询users表的数据
  16. UserModel.find({}, (err, doc) => {
  17. if (err) {
  18. console.log(err)
  19. return
  20. }
  21. console.log(doc)
  22. })
  23. })

max: 用于 Number 类型数据,最大值

比如将age的max设置为100,当我增加数据的时候,如果status的字段大于100就会报错(添加不成功),如果小于等于100就可以添加成功

min: 用于 Number 类型数据,最小值

比如将age的max设置0,当我增加数据的时候,如果status的字段小于0就会报错(添加不成功),如果大于等于0就可以添加成功

  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String,
  6. required: true,
  7. maxlength: 10
  8. },
  9. age: {
  10. type: Number,
  11. max: 100,
  12. min: 0
  13. },
  14. status: {
  15. type: Number,
  16. default: 1
  17. }
  18. })
  19.  
  20. // 定义model操作数据库
  21. let UserModel = mongoose.model('User',UserSchema,'users');
  22.  
  23. module.exports = UserModel
  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 101
  7. })
  8. u.save((err) => {
  9. if (err) {
  10. console.log(err)
  11. return
  12. }
  13. console.log('增加数据成功')
  14.  
  15. // 查询users表的数据
  16. UserModel.find({}, (err, doc) => {
  17. if (err) {
  18. console.log(err)
  19. return
  20. }
  21. console.log(doc)
  22. })
  23. })

当新增一个数据age字段大于100,报错了

enum:枚举类型,要求数据必须满足枚举值 enum:['0','1','2'],必须用在String的数据类型中

比如:新增数据的时候status字段的值必须是[0,1,2]中的其中一个

  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String,
  6. required: true,
  7. maxlength: 10
  8. },
  9. age: {
  10. type: Number,
  11. max: 100,
  12. min: 0
  13. },
  14. status: {
  15. type: String,
  16. default: '1',
  17. enum: ['0', '1', '2']
  18. }
  19. })
  20.  
  21. // 定义model操作数据库
  22. let UserModel = mongoose.model('User',UserSchema,'users');
  23.  
  24. module.exports = UserModel
  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 100,
  7. status: '4'
  8. })
  9. u.save((err) => {
  10. if (err) {
  11. console.log(err)
  12. return
  13. }
  14. console.log('增加数据成功')
  15.  
  16. // 查询users表的数据
  17. UserModel.find({}, (err, doc) => {
  18. if (err) {
  19. console.log(err)
  20. return
  21. }
  22. console.log(doc)
  23. })
  24. })

match:增加的数据必须符合 match(正则)的规则,适用于String类型

表示增加的数据必须满足这个正则才会添加成功,比如必须是合法的手机号码

  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String,
  6. required: true,
  7. maxlength: 10
  8. },
  9. age: {
  10. type: Number,
  11. max: 100,
  12. min: 0
  13. },
  14. status: {
  15. type: String,
  16. default: '1',
  17. enum: ['0', '1', '2']
  18. },
  19. phone:{
  20. type: String,
  21. match: /^1[3|4|5|7|8][0-9]\d{8}$/
  22. }
  23. })
  24.  
  25. // 定义model操作数据库
  26. let UserModel = mongoose.model('User',UserSchema,'users');
  27.  
  28. module.exports = UserModel

当我新增一条数据phone字段是一个合法的手机号码,结果显示添加成功,并且将我数据的手机号码是Number类型自动转成String类型

  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 100,
  7. status: '2',
  8. phone: 13824360121
  9. })
  10. u.save((err) => {
  11. if (err) {
  12. console.log(err)
  13. return
  14. }
  15. console.log('增加数据成功')
  16.  
  17. // 查询users表的数据
  18. UserModel.find({}, (err, doc) => {
  19. if (err) {
  20. console.log(err)
  21. return
  22. }
  23. console.log(doc)
  24. })
  25. })

当我新增一条数据phone字段不是合法的手机号码,就报错了

  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 100,
  7. status: '2',
  8. phone: 138243601211
  9. })
  10. u.save((err) => {
  11. if (err) {
  12. console.log(err)
  13. return
  14. }
  15. console.log('增加数据成功')
  16.  
  17. // 查询users表的数据
  18. UserModel.find({}, (err, doc) => {
  19. if (err) {
  20. console.log(err)
  21. return
  22. }
  23. console.log(doc)
  24. })
  25. })

maxlength:最大长度

minlength:最小长度

Mongoose 自定义的验证器

Mongoose中除了内置的校验参数,还可以自定义校验,使用validate来定义一个方法校验,如果通过验证返回 true,并且新增成功,没有通过则返回 false,新增失败

需求:定义一个字段desc,长度必须大于或等于10(数据类型可以是String和Number)

  1. let mongoose = require('./db')
  2.  
  3. let UserSchema = mongoose.Schema({
  4. name: {
  5. type: String,
  6. required: true,
  7. maxlength: 10
  8. },
  9. age: {
  10. type: Number,
  11. max: 100,
  12. min: 0
  13. },
  14. status: {
  15. type: String,
  16. default: '1',
  17. enum: ['0', '1', '2']
  18. },
  19. phone:{
  20. type: String,
  21. match: /^1[3|4|5|7|8][0-9]\d{8}$/
  22. },
  23. desc:{
  24. type:String,
  25. validate: (desc) => {
  26. return desc.length >= 10;
  27. }
  28. }
  29. })
  30.  
  31. // 定义model操作数据库
  32. let UserModel = mongoose.model('User',UserSchema,'users');
  33.  
  34. module.exports = UserModel

当我新增数据的时候,desc如果长度小于10就会报错

  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 100,
  7. status: '2',
  8. phone: 13824360121,
  9. desc: '123'
  10. })
  11. u.save((err) => {
  12. if (err) {
  13. console.log(err)
  14. return
  15. }
  16. console.log('增加数据成功')
  17.  
  18. // 查询users表的数据
  19. UserModel.find({}, (err, doc) => {
  20. if (err) {
  21. console.log(err)
  22. return
  23. }
  24. console.log(doc)
  25. })
  26. })

当我新增一个长度大于或者等于10的数据就成功了

  1. let UserModel = require('./model/users')
  2.  
  3. // 增加数据
  4. let u = new UserModel({
  5. name: '王五',
  6. age: 100,
  7. status: '2',
  8. phone: 13824360121,
  9. desc: 1234567890
  10. })
  11. u.save((err) => {
  12. if (err) {
  13. console.log(err)
  14. return
  15. }
  16. console.log('增加数据成功')
  17.  
  18. // 查询users表的数据
  19. UserModel.find({}, (err, doc) => {
  20. if (err) {
  21. console.log(err)
  22. return
  23. }
  24. console.log(doc)
  25. })
  26. })

Mongoose 数据校验的更多相关文章

  1. Struts2数据校验

    Struts2数据校验 1.常见数据校验方法 表单数据的校验方式: 表单中的数据必须被效验以后才能够被使用,常用的效验方式分为两种: 前台校验:也称之为客户端效验,主要是通过JS编程的方式进行表单数据 ...

  2. Spring MVC数据校验

    在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证.输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Jav ...

  3. spring mvc 数据校验

    1.需要导入的jar包: slf4j-api-1.7.21.jar validation-api-1.0.0.GA.jar hibernate-validator-4.0.1.GA.jar 2.访问页 ...

  4. SpringMvc中的数据校验

    SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...

  5. springmvc的数据校验

       springmvc的数据校验 在Web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对数据进行验证,输入验证分为客户端验证与服务器端验证. 客户端验证主要通过javaScript脚本 ...

  6. Struts 2 数据校验要用到的类和两种校验方式以及一些校验问题的解决

    通过继承ActionSupport类来完成Action开发,ActionSupport类不仅对Action接口进行简单实现, 同时增加了验证.本地化等支持 .真实开发中自定义Action都需要继承该类 ...

  7. Struts 2的数据校验

    既然说到了Struts 2的数据校验,我们该怎么去实现呢?又是通过什么来实现呢? 就让我带着大家一起来走进Struts 2的数据校验吧. 首先我们会想到在Stuts 2的登录案例中我们定义了一个Act ...

  8. 使用Struts2实现数据校验

    使用Struts2实现数据校验 为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的 ...

  9. WPF使用IDataErrorInfo进行数据校验

    这篇博客将介绍如何使用IDataErrorInfo进行数据校验.下面直接看例子.一个Customer类,两个属性(FirstName, Age) class Customer { public str ...

随机推荐

  1. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  2. [Linux] 树莓派编译python3.7.4

    python3.7.4 源码编译后遇到ssl错误: pip is configured with locations that require TLS/SSL, however the ssl mod ...

  3. vuex简单化理解和安装使用

     1.简单化理解 首先你要明白 vuex 的目的 就是为了 集中化的管理项目中 组件所有的 数据状态 (state) 0. 第一步你要明白 , store 的重要性 , store 类似一个中央基站, ...

  4. js中 !==和 !=的区别是什么

    1.比较结果上的区别 !=返回同类型值比较结果. !== 不同类型不比较,且无结果,同类型才比较. 2.比较过程上的区别 != 比较时,若类型不同,会偿试转换类型. !== 只有相同类型才会比较. 3 ...

  5. Vue学习之监听methods、watch及computed比较小结(十一)

    一.三者之间的对比: 1.methods方法表示一个具体的操作,主要书写业务逻辑: 2.watch:一个对象,键是需要观察的表达式,值是对应回调函数.主要用来监听某些特定数据的变化,从而进行某些具体业 ...

  6. sap unix timestamp转换

    之前和java做接口的时候就遇到过这个问题,对方的时间戳和SAP的时间戳是不同的. SAP的时间戳格式NNNNYYDD ZONE HHMMSS这样的一个数值. JAVA的时间戳是unix时间戳,是以1 ...

  7. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

  8. Bootstrap。

    bootstrap: 1.概念:前端开发框架. 2.快速入门:下载bootstrap.导入文件. 3.响应式布局: * 同一套页面可以兼容不同分辨率的设备. * 实现:依赖于栅格系统:将一行平均分成1 ...

  9. shell中read用法

    1. Read的一些选项 Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项. -a :将内容读入到数值中 1 2 3 echo -n "Input m ...

  10. blockingqueue.h

    #include <mutex> #include <condition_variable> #include <deque> template <typen ...