plastikaweb
1/7/2019 - 8:12 AM

mongoose validations

const mongoose = require('mongoose');

mongoose
  .connect('mongodb://localhost/playground')
  .then(() => console.log('Connected to MongoDB...'))
  .catch(err => console.error('could not connect to MongoDB...', err));

const courseSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true,
      minlength: 5,
      maxlength: 255
    },
    category: {
      type: String,
      required: true,
      enum: ['web', 'mobile', 'network'],
      lowercase: true,
      trim: true
    },
    author: String,
    tags: {
      type: Array,
      validate: {
        isAsync: true,
        validator: function(value, callback) {
          setTimeout(() => {
            const result = value && value.length > 0;
            callback(result);
          }, 1000);
        },
        message: 'A course should have at least one tag'
      }
    },
    date: { type: Date, default: Date.now },
    isPublished: Boolean,
    price: {
      type: Number,
      required: function() {
        return this.isPublished;
      },
      min: 10,
      max: 200,
      get: value => Math.round(value),
      set: value => Math.round(value)
    }
  },
  {
    toObject: {
      getters: true
    }
  }
);

const Course = mongoose.model('Course', courseSchema);

async function createCourse() {
  const course = new Course({
    name: 'jquery Course',
    category: 'Web',
    author: 'Carlos',
    tags: ['frontend', 'javascript'],
    isPublished: true,
    price: 23.05
  });

  try {
    const result = await course.save();
    console.log(result);
  } catch (e) {
    for (field in e.errors) {
      console.error(e.errors[field].message);
    }
  }
}

createCourse();

// Connected to MongoDB...
// { tags: [ 'frontend', 'javascript' ],
//  date: 2019-01-07T08:10:45.185Z,
//  _id: 5c330985e494490730c29527,
//  name: 'jquery Course',
//  category: 'web',
//  author: 'Carlos',
//  isPublished: true,
//  price: 23,
//  __v: 0,
//  id: '5c330985e494490730c29527' }