3.2.0 • Published 6 years ago

root v3.2.0

Weekly downloads
678
License
-
Repository
github
Last release
6 years ago

root

A super lightweight web framework with routing and prototype mixin support.

It's available through npm:

npm install root

build status

Usage

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

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');
});

URL normalization

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.

Error handling

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'});
});

Using sub apps

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

Full API

Response

  • 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 error
  • response.redirect(url) send a http redirect

Request

  • 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 form
  • request.on('body', listener) will buffer the body as a string
  • request.query contains the parsed querystring from the url

App

  • app.use(methodName, options, fn) extend the request or response with a new prototype method
  • app.(get|put|post|del|options|patch)(pattern, fn) add a route for a http method
  • app.all(pattern, fn) route all methods
  • app.route(request, response, callback) route a request or response from another app
  • app.error(statusCode, fn) add an error handler. use 4xx to match all 400 errors etc.
  • app.on('route', function (request, response) {}) emitted every time a request is being routed
  • app.on('match', function (request, response, pattern) {}) emitted every time a URL pattern is matched

License

MIT

3.2.0

6 years ago

3.1.0

7 years ago

3.0.0

9 years ago

2.0.0

10 years ago

1.1.0

10 years ago

1.0.0

10 years ago

0.7.1

10 years ago

0.7.0

10 years ago

0.6.5

10 years ago

0.6.4

10 years ago

0.6.3

10 years ago

0.6.2

10 years ago

0.6.1

10 years ago

0.6.0

11 years ago

0.5.17

11 years ago

0.5.16

11 years ago

0.5.15

11 years ago

0.5.14

11 years ago

0.5.13

11 years ago

0.5.12

11 years ago

0.5.11

11 years ago

0.5.9

11 years ago

0.5.8

11 years ago

0.5.7

11 years ago

0.5.6

11 years ago

0.5.5

11 years ago

0.5.4

11 years ago

0.5.3

11 years ago

0.5.2

12 years ago

0.5.1

12 years ago

0.5.0

12 years ago

0.4.6

12 years ago

0.4.5

12 years ago

0.4.4

12 years ago

0.4.3

12 years ago

0.4.1

12 years ago

0.4.0

12 years ago

0.3.13

12 years ago

0.3.12

12 years ago

0.3.10

12 years ago

0.3.9

12 years ago

0.3.8

12 years ago

0.3.6

12 years ago

0.3.5

12 years ago

0.3.4

12 years ago

0.3.3

12 years ago

0.3.2

12 years ago

0.3.1

12 years ago

0.3.0

12 years ago

0.2.17

12 years ago

0.2.16

12 years ago

0.2.15

12 years ago

0.2.14

12 years ago

0.2.12

12 years ago

0.2.11

12 years ago

0.2.10

12 years ago

0.2.9

12 years ago

0.2.8

12 years ago

0.2.7

12 years ago

0.2.6

12 years ago

0.2.4

12 years ago

0.2.3

12 years ago

0.2.2

12 years ago

0.2.0

12 years ago

0.1.6

12 years ago

0.1.5

12 years ago

0.1.4

12 years ago

0.1.3

12 years ago

0.1.2

12 years ago

0.1.1

12 years ago

0.1.0

12 years ago