mongoose③


前言


一、required验证器

1.required: true

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true // required为true,表示必填字段
    }
})
const books = mongoose.model('book', booksSchema)

books.create({}, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:因为name为必填字段,插入文档时没有填写,所以报错。

name: ValidatorError: Path `name` is required.

2.required: [true, ‘自定义错误信息’]

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段']
    }
})
const books = mongoose.model('book', booksSchema)

books.create({}, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:

name: ValidatorError: name为必填字段

二、String类型中的 enum、 maxlength 和 minlength 验证器

1.minlength、maxlength验证器

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段'],
        minlength: [2, 'name字段最小长度为2'],
        maxlength: [8, 'name字段最大长度为8']
    }
})
const books = mongoose.model('book', booksSchema)

books.create({ name: 'aaaaaaaaaaaaaaa' }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:

name: ValidatorError: name字段最大长度为8

2.enum 验证器

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段'],
        minlength: [2, 'name字段最小长度为2'],
        maxlength: [8, 'name字段最大长度为8']
    },
    type: {
        type: String,
        enum: ['仙侠修真', '恐怖悬疑', '热血冒险']// type字段的值只能是这三个
    }
})
const books = mongoose.model('book', booksSchema)

books.create({ name: '凡人修仙传', type: '修仙' }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:

type: ValidatorError: `修仙` is not a valid enum value for path `type`.

三、Number类型中的 max 和 min 验证器

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段'],
        minlength: [2, 'name字段最小长度为2'],
        maxlength: [8, 'name字段最大长度为8'],
        trim: true // 去除字符串两端空格
    },
    type: {
        type: String,
        enum: ['仙侠修真', '恐怖悬疑', '热血冒险']
    },
    number: {
        type: Number,
        min: [0, 'number字段最小数值为0'],
        max: [10, 'number字段最大数值为10'],
        required: true
    }
})
const books = mongoose.model('book', booksSchema)

books.create({ name: '   凡人修仙传   ', type: '仙侠修真', number: 100 }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:

number: ValidatorError: number字段最大数值为10

四、自定义验证器

代码如下:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段'],
        minlength: [2, 'name字段最小长度为2'],
        maxlength: [8, 'name字段最大长度为8'],
        trim: true // 去除字符串两端空格
    },
    type: {
        type: String,
        enum: ['仙侠修真', '恐怖悬疑', '热血冒险']
    },
    number: {
        type: Number,
        min: [0, 'number字段最小数值为0'],
        max: [10, 'number字段最大数值为10'],
        required: true
    },
    author: {
        type: String,
        validate: {
            validator: (value) => { // value为传入的值
                // 返回true验证成功,返回false验证失败
                return value == '忘语'
            },
            message: '作者名字写错了' // 自定义错误信息
        },
        required: true
    }
})
const books = mongoose.model('book', booksSchema)

books.create({ name: '   凡人修仙传   ', type: '仙侠修真', number: 10, author: '忘语111' }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

执行结果:

author: ValidatorError: 作者名字写错了

更改代码:

books.create({ name: '   凡人修仙传   ', type: '仙侠修真', number: 10, author: '忘语' }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

文档插入成功:

{
  name: '凡人修仙传',
  type: '仙侠修真',
  number: 10,
  author: '忘语',
  _id: new ObjectId("61e25424dc01768d7b9dec8b"),
  __v: 0
}

在这里插入图片描述

五、获取错误信息

其中number字段和author字段是填写错误的:

const booksSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'name为必填字段'],
        minlength: [2, 'name字段最小长度为2'],
        maxlength: [8, 'name字段最大长度为8'],
        trim: true // 去除字符串两端空格
    },
    type: {
        type: String,
        enum: ['仙侠修真', '恐怖悬疑', '热血冒险']
    },
    number: {
        type: Number,
        min: [0, 'number字段最小数值为0'],
        max: [10, 'number字段最大数值为10'],
        required: true
    },
    author: {
        type: String,
        validate: {
            validator: (value) => { // value为传入的值
                // 返回true验证成功,返回false验证失败
                return value == '忘语'
            },
            message: '作者名字写错了' // 自定义错误信息
        },
        required: true
    }
})
const books = mongoose.model('book', booksSchema)

books.create({ name: '   凡人修仙传   ', type: '仙侠修真', number: 200, author: '忘语111' }, (err, res) => {
    if (err) {
        console.log(err)
        return err
    }
    console.log(res)
})

错误信息:

Error: book validation failed: number: number字段最大数值为10, author: 作者名字写错了
    at ValidationError.inspect (D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\error\validation.js:48:26)
    at internal/per_context/primordials.js:23:32
    at formatValue (internal/util/inspect.js:783:19)
    at inspect (internal/util/inspect.js:337:10)
    at formatWithOptionsInternal (internal/util/inspect.js:2016:40)
    at formatWithOptions (internal/util/inspect.js:1898:10)
    at console.value (internal/console/constructor.js:323:14)
    at console.log (internal/console/constructor.js:358:61)
    at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\mongoose验证.js:44:17
    at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\helpers\promiseOrCallback.js:17:11 {
  errors: {
    number: ValidatorError: number字段最大数值为10
        at validate (D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1277:13)
        at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1260:7
        at Array.forEach (<anonymous>)
        at SchemaNumber.SchemaType.doValidate (D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1210:14)
        at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\document.js:2700:18
        at processTicksAndRejections (internal/process/task_queues.js:75:11) {
      properties: [Object],
      kind: 'max',
      path: 'number',
      value: 200,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    },
    author: ValidatorError: 作者名字写错了
        at validate (D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1277:13)
        at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1260:7
        at Array.forEach (<anonymous>)
        at SchemaString.SchemaType.doValidate (D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\schematype.js:1210:14)
        at D:\vscode\nodejs\FJstudy\mongoose\1.连接数据库\node_modules\mongoose\lib\document.js:2700:18
        at processTicksAndRejections (internal/process/task_queues.js:75:11) {
      properties: [Object],
      kind: 'user defined',
      path: 'author',
      value: '忘语111',
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    }
  },
  _message: 'book validation failed'
}

更改后的代码如下:

books.create({ name: '   凡人修仙传   ', type: '仙侠修真', number: 200, author: '忘语111' }, (err, res) => {
    if (err) {
        // console.log(err.errors)
        const errors = err.errors
        for (var key in errors) {
            console.log(errors[key]['properties'][['message']]);
        }
        return err
    }
    console.log(res)
})

提取后的错误信息:

number字段最大数值为10
作者名字写错了

六、预定义模式修饰符

1、trim

代码如下:

const singersSchema = new mongoose.Schema({
    name: {
        type: String,
        trim: true // 去掉两端空格
    }
})

const Singers = mongoose.model('singer', singersSchema)

Singers.create({ name: '  Leslie Cheung  ' }, (err, res) => {
    if (err)
        return err
    console.log(res)
})

执行结果:

{
  name: 'Leslie Cheung',
  _id: new ObjectId("61e2853521f0e96062807374"),
  __v: 0
}

2、uppercase

代码如下:

const singersSchema = new mongoose.Schema({
    name: {
        type: String,
        uppercase: true // 字符串全部变为大写
    }
})

const Singers = mongoose.model('singer', singersSchema)

Singers.create({ name: '  Leslie Cheung  ' }, (err, res) => {
    if (err)
        return err
    console.log(res)
})

执行结果:

{
  name: '  LESLIE CHEUNG  ',
  _id: new ObjectId("61e2858a014ba42ff721a82d"),
  __v: 0
}

3、lowercase

代码如下:

const singersSchema = new mongoose.Schema({
    name: {
        type: String,
        lowercase: true // 字符串全部变为小写
    }
})

const Singers = mongoose.model('singer', singersSchema)

Singers.create({ name: '  Leslie Cheung  ' }, (err, res) => {
    if (err)
        return err
    console.log(res)
})

执行结果:

{
  name: '  leslie cheung  ',
  _id: new ObjectId("61e2860ad35d71722d823831"),
  __v: 0
}

4、default

代码如下:

const singersSchema = new mongoose.Schema({
    name: {
        type: String,
        default: '张国荣' // 设置默认值
    }
})

const Singers = mongoose.model('singer', singersSchema)

Singers.create({}, (err, res) => {
    if (err)
        return err
    console.log(res)
})

执行结果:

{ name: '张国荣', _id: new ObjectId("61e28736d8ad21418dc3ff27"), __v: 0 }

总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值