Filters are functions that run before or after the action function. Each filter
is executed sequentially, one after the other, after the previous filter calls
next.
Filters help to untangle nested blocks of async code, and are especially useful for loading records from a database or implementing authentication and access control.
Before filters run before the action function.
PhotosController.before('show', function(next) {
var self = this;
Photo.findOne(this.param('id'), function(err, photo) {
if (err) { return next(err) }
self._photo = photo;
next();
});
});
PhotosController.show = function() {
this.title = this._photo.title;
this.description = this._photo.description;
this.render();
}
Specify * to run a filter before all actions in the controller.
PhotosController.before('*', function(next) {
// this executes before any action is invoked
});
Connect-style middleware can also be used as a filter.
For example, to limit the size of an upload:
PhotosController.before('upload', connect.limit('10mb'));
Or implementing authentication using Passport and connect-ensure-login:
LogInController.before('login', login.ensureLoggedOut('/'));
LogInController.before('login', passport.authenticate('local', { failureRedirect: '/login',
failureFlash: true }));
LogInController.login = function() {
this.redirect('/welcome');
}
After filters are identical to before filters, except that they run after the action, naturally.
PhotosController.after('show', function(next) {
hitCounter++;
next();
});
After error filters can be used to handle errors that occur within a controller.
PhotosController.after('*', function(err, req, res, next) {
this.render('error', { message: err.message });
});
If no after error filters are defined, the error will be passed out where it can be handled by application-level error handling middleware.