Skip to content

Routing Basics

Route Patterns - itty-router

Below we'll list some of the common route-matching patterns supported by itty-router. By default, all matched route params are accessible in the handlers as request.params, unless using the withParams middleware.

1. Fixed routes

Any fixed string will require a direct match.

router.get('/foo/bar/baz', handler)

// GET /foo/bar/baz

2. Simple route params

Prefix any named route param with a : to capture it. These are separated by slashes.

router.get('/todos/:id/:action', handler)

// GET /todos/13/edit

3. Optional route params

Make a route parameter optional by adding a ? after the name. In this example, actions becomes an optional parameter, allowing requests to match with or without it.

router.get('/todos/:id/:action?', handler)

// GET /todos/13
// GET /todos/13/edit

4. File formats/extensions

To capture a filename + extension, simply include the period before a final named group.

router.get('/files/:file.:extension', handler)
// GET /files/kitten.jpeg ==> { file: 'kitten', extension: 'jpg' }

router.get('/files/manifest.:extension?', handler)
// GET /files/manifest ==> {}
// GET /files/manifest.json ==> { extension: 'json' }

5. Wildcards

Especially useful for global middleware, nesting routers, etc., the wildcard * allows a route to match anything preceeding the *. It should be noted that this is a non-capturing group, and merely to allow matching.

router.all('*', handler)
// GET /todos/13/edit
// PUT /foo/bar
// GET /

router.get('/test/*', handler)
// GET /test/todos/13/edit
// GET /test/foo/bar

6. "Greedy" params

A final named route param may be set as "greedy" by adding a + to the end. This will capture anything following, including slashes and otherwise challenging characters.

For example:

router.get('/goto/:url+', handler)
// GET /goto/

Returns the following params:

  "url": ""