Gary Kaufman
Gary Kaufman

Reputation: 21

Why is my "req" undefined? "TypeError: Cannot read property 'headers' of undefined"

I am trying to implement authentication middleware to my routes in an Express Router.

When the router goes to the middleware and tries to read the req.headers["authorization"], I get the error:

const authHeader = req.headers["authorization"];
                         ^
TypeError: Cannot read property 'headers' of undefined

I'm not sure what I'm missing here, I've gone through the Express router middleware but couldn't find my answers there.

I have also tried not calling router.use(authenticateToken()); like this router.use(authenticateToken); and get this error: TypeError: Router.use() requires a middleware function but got a Object

Below is the middleware function and the route that I tried to use it on. Here is the project on GitHub in its current state.

// Authenticate Token!
authenticateToken = function (req, res, next) {
  const authHeader = req.headers["authorization"];
  console.log(authHeader);
  const token = authHeader && authHeader.split(" ")[1];
  if (token == null) {
    return res.sendStatus(401);
  } else {
    jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, username) => {
      if (err) {
        return res.sendStatus(403);
      } else {
        req.username = username;
        next();
      }
    });
  }
};
router.use(authenticateToken());

router.get("/", authenticateToken, async (req, res) => {
  try {
    const users = await User.find();
    res.status(200).json(users);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

Upvotes: 2

Views: 1914

Answers (3)

Gary Kaufman
Gary Kaufman

Reputation: 21

I figured it out! And sadly, it was unrelated to the code and question I had above.

I was missing the line module.exports = router; at the bottom of the file!

Thanks everyone!

Upvotes: 0

Wiktor Zychla
Wiktor Zychla

Reputation: 48279

You are incorrectly registering your middleware.

You have

router.get("/", authenticateToken(), async ...

while it should be

router.get("/", authenticateToken, async ...

The first incorrect version of yours tries to immediately call the method. Instead, the method reference should be passed to router so that it's the pipeline that calls you.

Upvotes: 3

Mohsen Mahoski
Mohsen Mahoski

Reputation: 492

I think you should define your middleware like this:

router.get("/", authenticateToken, async (req, res) => {
  try {
    const users = await User.find();
    res.status(200).json(users);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

Upvotes: 2

Related Questions