express-dry-router
v0.1.2
Published
Express router for people who hate repeating themselves
Downloads
12
Readme
express-dry-router
An express router for people who hate repeating themselves.
If we consider a typical route in an express app:
// app.js
var routes = require('./app/routes');
app.get('/admin/login', routes.admin.login);
// routes/index.js
exports.admin = {
login: function (req, res) {
res.render('login', { pageTitle: 'Login'});
};
The name of the route is repeated three times - twice in app.js (/admin/login
and routes.admin.login
) and as part of the object hirearchy in in routes/index.js
Expess-dry-router allows you to describe routes with a single source of truth, the object hierarchy. The above example could be re-written like this:
// app.js
var routes = require('./app/routes');
var configureDryRoutes = require('express-dry-router');
configureDryRoutes(routes, app);
// routes/index.js
module.exports = {
admin: {
login: {
get: function (req, res) {
res.render('login', { title: 'Login'});
}
}
}
};
Example
This example demonstrates setting up routes with GET, PUT, POST and DELETE HTTP methods.
var express = require('express');
var http = require('http');
var configureDryRoutes = require('express-dry-router');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.use(express.logger('dev'));
app.use(app.router);
var routes = {
myapp: {
resources: {
":id": {
get: function (req, res) {
res.send("Retrieve a representation of " + req.params.id);
},
put: function (req, res) {
res.send("Replace " + req.params.id + ", or if it doesn't exist, create it.");
},
post: function (req, res) {
res.send("Not generally used.");
},
delete: function (req, res) {
res.send("Delete " + req.params.id);
}
},
get: function (req, res) {
res.send("List the URIs and perhaps other details of the collection's members.");
},
put: function (req, res) {
res.send("Replace the entire collection with another collection.");
},
post: function (req, res) {
res.send("Create a new entry in the collection. The new entry's URI is assigned automatically and is usually returned by the operation.");
},
delete: function (req, res) {
res.send("Delete the entire collection.");
}
}
}
};
configureDryRoutes(routes, app);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
Opening http://localhost:3000/myapp/resources in a browser will cause a HTTP GET request to be sent to the server. The handler defined in rotues.myapp.resources.get
will be called and "List the URIs and perhaps other details of the collection's members." will be returned in the HTTP response to the browser.
Opening http://localhost:3000/myapp/resources/item1 in a browser will cause a HTTP GET request to being sent to the server. The handler defined in rotues.myapp.resources.":id".get
will be called and "Retrieve a representation of item1" will be returned in the HTTP response to the browser.
Creating a HTTP request with one of the other HTTP methods (PUT, POST and DELETE) will cause the corresponding handlers in the rotues
object hierarchy to be called. This can be tested using the Dev HTTP Client in Chrome, for example.