Middleware
Similar to Mongoose middleware, Lounge exposes pre and post hooks.
Normally this is used to do additional validation pre save, and cleanup post document removal. Although the hooks can be
setup for any method including toObject and toJSON methods.
var userSchema = lounge.schema({
firstName: String,
lastName: String,
email: String
})
userSchema.pre('save', function (next) {
if (this.email) {
this.email = this.email.toLowerCase()
}
// we must call next to continue control flow
next()
})
userSchema.post('remove', function () {
console.log('document %s removed', this.id)
})
Important note here is that post 'save' and 'remove' hooks do not receive any form of control flow. There are no
callbacks passed.
The callback passed into pre hooks can be used to control flow of logic and execution:
schema.pre('save', function (next) {
// some custom validation method
if (!this.validate()) {
return next(new Error('Validation error!'))
}
next()
})
// elsewhere...
doc.save(function(err, savedDoc) {
if(err) console.log(err) // 'Validation error!' Document was not saved
})
onBeforeValueSet(key, value) / onValueSet(key, value)
onBeforeValueSet / onValueSet allow you to bind an event handler to all write operations on an object.
Currently, it will only notify of write operations on the object itself and will not notify you when child objects are
written to. If you return false or throw an error within the onBeforeValueSet handler, the write operation will be
cancelled. Throwing an error will add the error to the error stack.
var User = lounge.schema({ name: String }, {
onBeforeValueSet: function(key, value) {
if(key === 'name' && value.indexOf('Joe') === -1) {
return false
})
}
})
var User = lounge.model('User', schema)
var user = new User()
user.name = 'Bill' // { name: undefined }
user.name = 'Joe Smith' // { name: 'Joe Smith' }