简体   繁体   中英

How to validate Array of Objects in Mongoose

I need to validate the array of objects in my schema

Schema: 
user: [{
name: String,
Age: String,
Contact: Number
}]

How to validate name, age and contact.

I assume your user array is inside another schema.

Let's say we have a Course model with users like this:

const mongoose = require("mongoose");

const courseSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  users: [
    {
      name: { type: String, required: [true, "Name is required"] },
      age: { type: Number, required: [true, "Age is required"] },
      contact: { type: Number, required: [true, "Contact is required"] }
    }
  ]
});

const Course = mongoose.model("Post", courseSchema);

module.exports = Course;

To validate this in a post route you can use mongoose model validateSync method:

const Course = require("../models/course");

router.post("/course", async (req, res) => {
  const { name, users } = req.body;

  const course = new Course({ name, users });

  const validationErrors = course.validateSync();

  if (validationErrors) {
    res.status(400).send(validationErrors.message);
  } else {
    const result = await course.save();
    res.send(result);
  }
});

When we send a requset body without required fields like age and contact:

(you can also transform validationErrors.errors for more useful error messages.)

{
    "name": "course 1",
    "users": [{"name": "name 1"}, {"name": "name 2", "age": 22, "contact": 2222}]
}

The result will be like this:

Post validation failed: users.0.contact: Contact is required, users.0.age: Age is required

It will be similar to the usual validation but inside an array, you need to make a validator function as so:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

//the custom validation that will get applied to the features attribute.
var notEmpty = function(features){
    if(features.length === 0){return false}
    else {return true};
}

var CarSchema = new Schema({
    name: {
        type: String,
        required: true,
    },
    features: [{
        type: Schema.ObjectId,
        ref: Feature
        required: true; //this will prevent a Car model from being saved without a features array.
        validate: [notEmpty, 'Please add at least one feature in the features array'] //this adds custom validation through the function check of notEmpty.
    }]
});

var FeatureSchema = new Schema({
    name: {
        type: String,
        required: true //this will prevent a Feature model from being saved without a name attribute.
    }
});

mongoose.model('Car', CarSchema);
mongoose.model('Feature', FeatureSchema);

By using type key/property:

var breakfastSchema = new Schema({
  eggs: {
    type: Number,
    min: [6, 'Too few eggs'],
    max: 12
  },
  bacon: {
    type: Number,
    required: [true, 'Why no bacon?']
  },
  drink: {
    type: String,
    enum: ['Coffee', 'Tea'],
    required: function() {
      return this.bacon > 3;
    }
  }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM