Search code examples
javascriptnode.jsexpressmiddleware

Why adding a get parameter forces middleware execution


I have got a middleware like this

// route middleware to verify a token
app.use(function(req, res, next) {

  console.log(req.baseUrl);

  // check header or url parameters or post parameters for token
  var token = req.body.token || req.query.token || req.headers['x-access-token'];

  // decode token
  if (token) {

    // verifies secret and checks exp
    jwt.verify(token, app.get('superSecret'), function(err, decoded) {
      if (err) {
        return res.json({
          success: false,
          message: 'Failed to authenticate token.'
        });
      } else {
        // if everything is good, save to request for use in other routes
        req.decoded = decoded;
        next();
      }
    });

  } else {

    // if there is no token
    // return an error
    return res.status(403).send({
      success: false,
      message: 'No token provided.'
    });

  }
});

This route http://localhost:8080/verifyAccount doesn't responds as No token provided

app.get('/verifyAccount', function (req, res) {
  res.json({ message: 'Welcome to verify account!' });
});

But the following route http://localhost:8080/verifyAccount?id=123 does:

app.get('/verifyAccount/:id', function (req, res) {
  res.json({ message: 'Welcome to verify account!' });
});

The middleware code is at the bottom in the code file and the get paths are upwards

What is that concept behind?

Why adding a get parameter forces middleware execution?

Just found that if I call it like this http://localhost:8080/verifyAccount/id=123, it properly returns Welcome to verify account!


Solution

  • Found that the issue was in the way by which the route was getting called. Thanks to Thomas Theiner for the help.

    The request with query parameter ?id=123 does not match with /:id. It should be called as verifyAccount/123 instead.

    Since, the route ?id=123 did not matched any of the path. Hence, was finally reaching the middleware for execution

    The position determines the parameter, not the name. The name is only used inside node code to reference the parameter.

    For multiple parameters, we'll have multiple slashes like verifyAccount/:id/:otherParameter which would be called using verifyAccount/123/234