visionmedia / express-resource

Resourceful routing for Express
1.41k stars 140 forks source link

Same resource nested and un-nested -> double call to auto-load #50

Open Spiralis opened 12 years ago

Spiralis commented 12 years ago

Hi,

I have two resources, Collections and Teams, that I am exposing using express-resource, like this:

var competitions = app.resource("competitions", require('./resources/competitions'));
var teams        = app.resource("teams",        require('./resources/teams'));
competitions.add(teams);

Teams is then a nested resource within it's parent competition, which is as I wanted it to be. However, I also wanted teams to be accessible as it's own resource. In other words, like this:

/competitions/:id/teams/:id /teams/:id

So, to get this I changed the code as follows:

var competitions = app.resource("competitions", require('./resources/competitions'));
var teams        = app.resource("teams",        require('./resources/teams'));
competitions.add(teams);
teams = app.resource("teams", require('./resources/teams'));

I don't know if this is the way it is supposed to be set up, but this actually works. There is only one small problem. I have an auto-load method setup for the team-resource, and when I access the /teams/:id resource it actually ends up calling the auto-load twice. I guess that somehow it fires for both the teams/.id and the competitions/:id/teams/:id resource?

Any ide on how to avoid this from happening?

kb19 commented 11 years ago

I ran into this as well. I used the express-resource map function to manually define my non-nested routes . I don't use the auto-load functionality but you could give this method a shot if you're still running into this issue.

tenant.map( 'del', '/:tenant', tenantModule.destroy );
tenant.map( 'get', '/:tenant', tenantModule.show );
tenant.map( 'put', '/:tenant', tenantModule.update );

location.add( tenant );
wanbok commented 11 years ago

+1