router.use seems to be documented to allow you to add middleware that will only be called for routes added to that router, but that does not seem to be working for me. The issue seems to be because I’m mounting several routers at the same path. The decision for whether a middleware is run seems to be based on the path, not the router. This was confusing.
The use case here is that my application has several modules that are mounted under the same location, as the URLs for these don’t always follow a common prefix. There’s common middleware that is used on most, but not all, endpoints. I was attempting to refactor the application to use an express.Router for each module, with each router being able to .use whatever middleware is common to all of its routes.
The result has been that the same middleware is called multiple times, because several routers are all using it. They should be separated, if Router worked as described. Another case is that one module used a middleware to require auth on all of the endpoints in its router, but that spilled over to any other routers used after that one.
Is this intended behavior? Is there a workaround?
Here is a Gist demonstrating the issue: https://gist.github.com/mjm/497a23f68826f8ca473b