A super lightweight web framework with routing and prototype mixin support.
It's available through npm:
npm install root
Usage is simple
var root = require('root');
var app = root();
app.get('/', function(request, response) {
response.send({hello:'world'});
});
app.post('/echo', function(request, response) {
request.on('json', function(body) {
response.send(body);
});
});
app.listen(8080);
You can extend the request and response with your own methods
app.use('response.time', function() {
this.send({time:this.request.time});
});
app.use('request.time', {getter:true}, function() {
return Date.now();
});
app.get(function(request, response) {
response.time();
});
Routing is done using murl.
Use the get
, post
, put
, del
, patch
or options
method to specify the HTTP method you want to route
app.get('/hello/{world}', function(request, response) {
response.send({world:request.params.world});
});
app.get('/test', function(request, response, next) {
// call next to call the next matching route
next();
});
app.get('/test', function(request, response) {
response.send('ok');
});
Before routing an incoming url it is first decoded and normalized
/../../
⇨/
/foo/bar/../baz
⇨/foo/baz
/foo%20bar
⇨/foo bar
/foo%2fbar
⇨/foo/bar
This basicly means that you don't need to worry about /..
attacks when serving files or similar.
You can specify an error handler for a specific error code by using the error
function
app.get('/foo', function(request, response) {
response.error(400, 'bad request man');
});
app.error(404, function(request, response, opts) {
// opts contains .message which is the message passed to response.error
// and .stack if an error was passed
response.send({error:'could not find route'});
});
app.error(function(request, response, opts) {
response.send({error:'catch all other errors'});
});
Route requests through an sub app by using app.route
var mobileApp = root();
var myApp = root();
...
myApp.all('/m/*', function(request, response, next) {
// all routes starting with /m should route through our mobile app as well
mobileApp.route(request, response, next);
});
As a shortcut you can just pass the app directly
myApp.all('/m/*', mobileApp);
This allows you to easily split up your application into seperate parts and mount them all on one server
response.send(json)
will send back json.response.send(string)
will send back html (if no Content-Type has been set).response.error(statusCode, messageOrError)
send back an errorresponse.redirect(url)
send a http redirect
request.on('json', listener)
will buffer and parse the body as JSON.request.on('form', listener)
will buffer and parse the body as a url encoded formrequest.on('body', listener)
will buffer the body as a stringrequest.query
contains the parsed querystring from the url
app.use(methodName, options, fn)
extend the request or response with a new prototype methodapp.(get|put|post|del|options|patch)(pattern, fn)
add a route for a http methodapp.all(pattern, fn)
route all methodsapp.route(request, response, callback)
route a request or response from another appapp.error(statusCode, fn)
add an error handler. use4xx
to match all 400 errors etc.app.on('route', function (request, response) {})
emitted every time a request is being routedapp.on('match', function (request, response, pattern) {})
emitted every time a URL pattern is matched
MIT