The Problem
You love Mongoose for all it's convenience methods and
valiate-before-saving logic, but but you store complex objects using
Schema.Types.Mixed
which lacks validation in Mongoose, or you just wish
you could validate objects, strings, etc. using a richer
JSON-schema vocabulary than is included with
Mongoose.
The Solution
The mongoose-ajv-plugin
lets you use the awesome AJV JSON-Schema
validation library, to validate individual attributes or entire
documents, giving you access to it's rich extensible schema vocabulary and convenience
formats like email, Date, hostname, ect.
Getting Started
Import mongoose and add in the mongoose-ajv-plugin
:
var mongoose = require("mongoose");
mongoose.plugin(require("mongoose-ajv-plugin"))
Now use your favorite AJV Schema, such as the ajv_contact_schema
defined
below, to validate entire documents using the "ajv-schema"
keyword, like
so:
var Contact_schema = new mongoose.Schema({
"name": String ,
"email": String,
"birthday": String,
"ajv-schema": ajv_contact_schema
});
Or use AJV to validate one or more attributes of a document using the "ajv-schema"
option:
var Player_schema = new Schema({
"user_name": String,
"rank": Number,
"ip_address": {
"type": String,
"ajv-schema": {
"type": 'string',
"format": 'ipv4' /
}
},
"contact-info": {
"type": Schema.Types.Mixed ,
"ajv-schema": contact_json_schema
},
});
Using AJV Extensions
If you wish to extend the Ajv instance used for validation with additional
schemata,
formats,
or keywords, you can
pass your own (extended) ajv instance to the plugin, like so:
var Ajv = require("ajv");
var ajv = new Ajv();
ajv.addSchema(...);
ajv.addKewword(...)
ajv.addFormat(...)
require("my-ajv-plugin")(ajv)
mongoose.plugin(require("mongoose-ajv-plugin",{"ajv":ajv})
var my_schema = new mongoose.Schema({...});
my_schema.plugin(require("mongoose-ajv-plugin",{"ajv":ajv})
Contact JSON schema
And finally, here's the definition of ajv_contact_schema
used in the
above examples:
var ajv_contact_schema = {
"type":"object",
"properties":{
"name": {
"type":"string"
},
"email": {
"type":"string",
"fomrat":"email"
},
"birthday": {
"oneOf":[
{"$ref":"#/definitions/date"},
{"$ref":"#/definitions/date-time"}
]
}
},
"required":[
"name",
"email"
],
"definitions":{
"date":{
"type":"string",
"format":"date"
},
"date-time":{
"type":"string",
"format":"date-time"
}
}
};