Simple HTTP routing in Javascript.
Here is an example of simple recognition run from Node.js.
var Sherpa = require('./lib/sherpa')
var sherpa = new Sherpa.Router();
sherpa.add('/test').to('testRoute')
sherpa.recognize('/test')
Would return:
{
"destination": "testing",
"params": {},
}
You can have a path with a variable in it by prepending a : to it. For example:
sherpa.add('/test/:variable').to('testing') sherpa.recognize('/test/iloveyou')
Would return
{
"destination": "testing",
"params": {
"variable": "iloveyou"
}
}
Variables by default will not match beyond a slash (/) or a period (.).
sherpa.recognize('/test/iloveyou.html')
Would return
undefined
You can get around this by adding a matchesWith regex
sherpa.add('/test/:variable', {matchesWith: {variable: /.*/}}).to('testing') sherpa.recognize('/test/iloveyou.html')
Would return
{
"destination": "testing",
"params": {
"test2": "testing.help"
}
}
And…
sherpa.add('/test2/:test2.:format', {matchesWith: {format: /html|text/}}).to('testing') sherpa.recognize('/test2/testing.json')
Would return
undefined
But if you change the extension to one supported by the matchesWith specified,
sherpa.recognize('/test2/testing.html')
Would return
{
"destination": "testing",
"params": {
"test2": "testing",
"format": "html"
}
}
Optional parts of the path are marked with ( and ). For example:
sherpa.add('/test(/:variable)').to('testing') sherpa.recognize('/test/world')
Would return
{
"destination": "testing",
"params": {
"variable": "world"
}
}
And
sherpa.add('/test(/:variable)').to('testing') sherpa.recognize('/test')
Would return only
{
"destination": "testing",
"params": { }
}
You can also specify other parts of the request to match on using conditions.
sherpa.add('/test', {conditions: {method: 'GET'}}).to('testing') sherpa.recognize('/test', {method: 'GET'}) { "destination": "testing", "params": {} }
But
sherpa.recognize('/test', {method: 'POST'})
Will just return
undefined
You can also use regex here, such as:
sherpa.add('/test', {conditions: {method: /GET|POST/}}).to('testing')
Generating is easy too.
sherpa.add('/test2/:test2.:format').name('test') sherpa.generate('test', {test2: 'variable', format: 'html'})
Would return
"/test2/variable.html"
Any extra variables used as params would be appended as part of the query string.
sherpa.generate('test', {test2: 'variable', format: 'html', page: '1'})
Would return
"/test2/variable.html?page=1"
Sherpa has an interface to allow it to work with the Connect framework.
var Sherpa = require('sherpa/connect'),
router = new Sherpa.Connect();
In addition to the normal methods avaliable with the router, there are also a number of helpers defined.
GET, POST, PUT, DELETE, HEAD, OPTIONS, ANY
router.GET( "/some url", function(req,resp,next){ doSomething(); });
router.POST( "/some url", function(req,resp,next){ doSomething(); });
router.GET( "/some url", function(req,resp,next){ doSomething(); });
router.DELETE( "/some url", function(req,resp,next){ doSomething(); });
router.HEAD( "/some url", function(req,resp,next){ doSomething(); });
router.ANY( "/", function(req, resp, next){ pressTheAnyKey(); });
To connect the router into the Connect middleware system:
var server = Connect.createServer(); server.use("/mount_point", router.connect())
To use this within Node.js, simply use the Node.js interface. Here is a simple example:
require('../lib/sherpa')
var sys = require("sys"), http = require("http");
http.createServer(new Sherpa.interfaces.NodeJs([
['/hello', function (request, response) {
response.sendHeader(200, {"Content-Type": "text/plain"});
response.sendBody("Hello World\n");
response.finish();
}],
['/hello/:name', {matchesWith: {name: /^\d+$/}}, function (request, response) {
response.sendHeader(200, {"Content-Type": "text/plain"});
response.sendBody("Hello Number "+request.sherpaResponse.params['name']+"\n");
response.finish();
}],
['/hello/:name', function (request, response) {
response.sendHeader(200, {"Content-Type": "text/plain"});
response.sendBody("Hello "+request.sherpaResponse.params['name']+"\n");
response.finish();
}],
['/hello/:name', {conditions:{method: 'POST'}}, function (request, response) {
response.sendHeader(200, {"Content-Type": "text/plain"});
response.sendBody("Hello POSTY "+request.sherpaResponse.params['name']+"\n");
response.finish();
}],
['not found', function (request, response) {
response.sendHeader(404, {"Content-Type": "text/plain"});
response.sendBody("I can't find what you're looking for..");
response.finish();
}]
]).listener()).listen(8000);
sys.puts("Server running at http://127.0.0.1:8000/");
Then calling to /hello would produce Hello World, /hello/daniel would produce Hello daniel and any other request would respond with a 404 and I can't find what you're looking for...