Gus Hogg-Blake
Gus Hogg-Blake

Reputation: 2511

Nested routes in express, where a parent route includes a param

What is the best way of defining a route hierarchy so that I have a basic URL of /page/:id, and then urls like /page/:id/delete and /page/:id/edit, without having to repeat the /page/:id bit in all the paths?

I've tried the following, but the id param isn't available in the sub routes:

pageActions = express.Router!

pageActions.get "/delete", (request, response) ->
    request.params.id #undefined

app.use "/page/:id", pageActions

I can't see any mention of this behaviour in the routing guide, but it seems like it would be useful to have all of the params available here, especially since having params in the route's "mount path" is allowed.

Upvotes: 14

Views: 12177

Answers (2)

Gus Hogg-Blake
Gus Hogg-Blake

Reputation: 2511

Use the Router's mergeParams option to inherit the route params from the parent: http://expressjs.com/4x/api.html#router

Upvotes: -7

Jason Cust
Jason Cust

Reputation: 10899

There are two things I believe you might be confused about.

First, you shouldn't be using the get method for delete functions. Instead, you should be using the delete method. These are two of the HTTP shortcut methods that are mapped to what is sent in the request. This shows the full list of the shortcuts that are supported by ExpressJS and these all can be used by a router as well.

Second, if you are using a ExpressJS Router and you want to preserve parameters from the path where you are mounting the router you need to let ExpressJS know that with the mergeParams option:

var router = express.Router({mergeParams: true});

Upvotes: 53

Related Questions