Before we get into the specifics of validation syntax, please keep the following rules in mind:
-
Validation is defined in the
Schema
-
Validation occurs when a document attempts to be saved, after defaults have been applied.
-
Mongoose doesn't care about complex error message construction. Errors have type identifiers. For example,
"min"
is the identifier for the error triggered when a number doesn't meet the minimum value. The path and value that triggered the error can be accessed in theValidationError
object. -
Validation is an internal piece of middleware
-
Validation is asynchronously recursive: when you call
Model#save
, embedded documents validation is executed. If an error happens, yourModel#save
callback receives it.
Simple validation is declared by passing a function to validate
and an error
type to your SchemaType
(please read the chapter on model definition to learn
more about schemas).
function validator (v) {
return v.length > 5;
};
new Schema({
name: { type: String, validate: [validator, 'my error type'] }
})
If you find this syntax too clumsy, you can also define the type
var schema = new Schema({
name: String
})
and then your validator
schema.path('name').validate(function (v) {
return v.length > 5;
}, 'my error type');
If you want to test a certain value against a regular expression:
var schema = new Schema({
name: { type: String, validate: /[a-z]/ }
});
If you define a validator function with two parameters, like:
schema.path('name').validate(function (v, fn) {
// my logic
}, 'my error type');
Then the function fn
has to be called with true
or false
, depending on
whether the validator passed. This allows for calling other models and querying
data asynchronously from your validator.
-
For Strings:
-
enum
: takes a list of allowed values. Example:var Post = new Schema({ type: { type: String, enum: ['page', 'post', 'link'] } })
-
-
For Numbers:
-
min
: minimum valuevar Person = new Schema({ age: { type: Number, min: 5 } })
-
max
: maxmimum valuevar Person = new Schema({ age: { type: Number, max: 100 } })
-