'How can I share a root path using Express?

I want to be able to have two endpoints sharing the root path, both for different purposes. One will be for obtain a user via its ID and the other via token.

Right now I have the following routes:

router.get('/:idUser', paramValidationRules(), validate, verifyJWT, getUserFromId);
router.route('/me').get(verifyJWT, getUserFromToken);

Running tests, the 'me' on the second route is considered a parameter and its redirected to the first route. Is possible to share a root path specifying that one will be used strictly to 'me' and the other one to an integer?



Solution 1:[1]

First, you're always hitting /:idUser before /me, so it will always stop at /:iduser and never react me.

So to solve the issue that you can never access /me, put the /me route declaration before /:idUser.

As to only catching numbers, there isn't a built in way, but you could use middleware (and change the order of your routes to the original):

router.get('/:idUser', function(req, res, next) {
  req.id = /^\d+$/.test(req.params.idUser);
  next();
}, paramValidationRules(), validate, verifyJWT, getUserFromId);

Then, (unfortunately) in all your middleware and handler (or just the handler) in the opening of the function add:

if(!req.id)
  return next();

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1