diff --git a/README.md b/README.md index 33fb871..d1ecfeb 100644 --- a/README.md +++ b/README.md @@ -73,4 +73,11 @@ router.route('/by/func/123') router.route('/unknown/route', function (err) { // Router.isNotFound(err) === true }) + +// Can pass arguments to route handler +router.add(['/with/args', toInt], function (someObj, param) { + // someObj = {some: 'obj'} + // param === 123 +}) +router.route('/with/args/123', {args: [{some: 'obj'}]}) ``` diff --git a/lib/router.js b/lib/router.js index 69135e9..2603bb5 100644 --- a/lib/router.js +++ b/lib/router.js @@ -20,10 +20,16 @@ assign(Router.prototype, { return this.routes.add(this._uriToParts(path), handler) }, - route: function route(path, done) { + route: function route(path, options, done) { + if (done == null && isFunction(options)) { + done = options + options = {} + } + options = options || {} var routeArray = this._uriToParts(path) done = done || noop - return this.routes.get(routeArray, [], function (err, func, context, args) { + + function _routeCallback(err, func, context, args) { if (err) { return done(err) } else { @@ -33,7 +39,9 @@ assign(Router.prototype, { return done(new NotFoundError('not found', {location: path})) } } - }) + } + + return this.routes.get(routeArray, (options.args || []), _routeCallback) }, _uriToParts: function _uriToParts(uri) { diff --git a/package.json b/package.json index e6b51f5..a972feb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "routing-buddy", - "version": "0.1.2", + "version": "0.2.0", "description": "Another router library for both client and server", "main": "lib/router.js", "scripts": { diff --git a/test/route-node.js b/test/route-node.js index 64fca80..7e0d308 100644 --- a/test/route-node.js +++ b/test/route-node.js @@ -78,5 +78,14 @@ module.exports = describe('RouteNode', function () { }) }) + it('→ pass arguments to handler before parsing', function (done) { + var obj = {} + node.add(['id', /\d+/], callback) + node.get(['id', '123'], [obj], function (err, cb, ctx, args) { + expect(args).toEqual([obj, '123']) + done() + }) + }) + }) }) diff --git a/test/router.js b/test/router.js index 62466b0..6238e3a 100644 --- a/test/router.js +++ b/test/router.js @@ -86,6 +86,18 @@ describe('Router', function () { }) }) + it('→ pass in arguments before capturing path arguments', function (done) { + var router = new Router() + var api = {key: 123, any: 'object is passed', method: function () {}} + router.add(['/by/order', /(\d+)/], function (inputApi, urlParam) { + expect(inputApi).toBe(api) + expect(urlParam).toBe('123') + done() + }) + + router.route('/by/order/123', {args: [api]}) + }) + it('→ get based on function', function (done) { function toInt(part) { var results = /^(\d+)$/.exec(part) @@ -102,7 +114,7 @@ describe('Router', function () { }) router.route('/by/order/123', function (err) { - expect(err).toBe(null, err && err.message) + expect(err).toBe(null) done() }) })