node.jsexpresspostmannode-mysql

Why is routing to 'name' not working when it works for 'id'?


I have local backend on mysql and I am using connect Node.js to connect both of them. Everything is working fine. The connection is succesfull all the queries are happening but why is this not working.

router.get("/:users/:name", (req, res) => {
  const { name } = req.params;
  console.log(req.params);
  mysqlConnection.query(
    "SELECT * FROM user WHERE name = ?",
    [name],
    (error, rows, fields) => {
      console.log(rows);
      console.log(error);
      if (!error) {
        res.json(rows);
      } else {
        console.log(error);
      }
    }
  );
});

whereas it's counterpart is working.

router.get("/:users/:id", (req, res) => {
  const { id } = req.params;
  mysqlConnection.query(
    "select * from user where id = ?",
    [id],
    (error, rows, fields) => {
      if (!error) {
        res.json(rows);
      } else {
        console.log(error);
      }
    }
  );
});

I am using Postman to test my routes. eg: localhost:8080\users\name

I have tried this


router.get("/:users/:name", (req, res) => {
  const { name } = req.params;
  console.log(req.params);
  mysqlConnection.query(
    `SELECT * FROM user WHERE name = '${name}'`,
    (error, rows, fields) => {
      console.log(rows);
      console.log(error);
      if (!error) {
        res.json(rows);
      } else {
        console.log(error);
      }
    }
  );
});


Solution

  • The issue here is that Express cannot differentiate between :id and :name; they're both just single string parameters so any matching request will be routed to whatever one is registered first.

    Assuming that id is numeric, you can provide more matching information so Express knows where to route requests like /users/123

    // register the more specific route first
    router.get("/users/:id(\\d+)", (req, res) => {
      const { id } = req.params;
    
      // etc...
    });
    
    // register the more general route second
    router.get("/users/:name", (req, res) => {
      const { name } = req.params;
    
      // etc...
    });
    

    See Route parameters