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 to share