Express-Validator Check array of subdocuments

This is my schematic:

const InvoiceSchema = new Schema({
name: { type: String, required: true },
description: { type: String },

items: [{
    name: { type: String, required: true },
    rate: { type: Number, required: true },
    quantity: { type: Number, required:true, default: 1 },
    amount: { type: Number }
}]});

      

I want to know how to use Express-validator to validate elements of elements?

+3


source to share


1 answer


There was the same problem and very painful, especially if its an array or an array of objects to check. I ended up creating my own validator ( wallter ) that will handle this issue. And also this tool can generate a validation schema directly from your mongoose model.

So your schema above will generate a validation schema:

{
  "name": {
    "required": {
      "msg": "Value for field 'name' is required"
    }
  },
  "description": {
    "optional": true
  },
  "items.*.name": {
    "required": {
      "msg": "Value for field 'items.*.name' is required"
    }
  },
  "items.*.rate": {
    "required": {
      "msg": "Value for field 'items.*.rate' is required"
    },
    "isDecimal": {
      "msg": "Expecting 'decimal' value for field 'items.*.rate'"
    }
  },
  "items.*.quantity": {
    "required": {
      "msg": "Value for field 'items.*.quantity' is required"
    },
    "isDecimal": {
      "msg": "Expecting 'decimal' value for field 'items.*.quantity'"
    }
  },
  "items.*.amount": {
    "optional": true,
    "isDecimal": {
      "msg": "Expecting 'decimal' value for field 'items.*.amount'"
    }
  }
}

      



This validation scheme can be sent to the validator

const halter = require('wallter').halter
const Builder = require('wallter').builder // validation schema builder

const builder = new Builder({
  model: mongoose.model('YourModelName')
})

server.use(halter())

server.post('/test', function (req, res, next) {
    let validationSchema = builder.build() // see above generated validation schema output

    req.halt(validationSchema).then(result => {
        if (result.length) {
            res.send(400, result)
        } else {
            res.send(200)
        }

        return next()
    })
})

      

0


source







All Articles