0

When I'm trying to destructure object in my express middleware:

const checkIfLoggedIn = (req, res, next) => {
    try {
        const { token } = req.cookies['jwt-auth'];
        console.log('token: ', token);
        req.token = jwt.verify(token, SECRET);
        next();

    } catch (err) {
        console.error(err);
        res
            .status(401)
            .json({
                ok: false,
                message: 'ERROR: you need to be logged in'
            });
    }
}

My app prints this:

TypeError: Cannot destructure property 'token' of 'req.cookies.jwt-auth' as it is undefined.
    at checkIfLoggedIn (/home/bader/Projects/be_productive/services/authorization.middleware.js:8:17)
    at Layer.handle [as handle_request] (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:328:13)
    at /home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:286:9
    at Function.process_params (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:346:12)
    at next (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:280:10)
    at cookieParser (/home/bader/Projects/be_productive/node_modules/.pnpm/cookie-parser@1.4.6/node_modules/cookie-parser/index.js:57:14)
    at Layer.handle [as handle_request] (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:328:13)
    at /home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:286:9
token:  (Token from front-end (I change this line))

I don't know why It prints error, especially that console.log works and print correct token

I try to use dot instead of destructuring in every combination and it still doesn't work

Bader
  • 23
  • 4

1 Answers1

0

You should add an explicit check before destructuring the jwt-auth token in case it isn't present:

const checkIfLoggedIn = (req, res, next) => {
    try {
        const jwtAuth = req.cookies['jwt-auth']
        if (jwtAuth === undefined) {
          throw new Error('missing token');
        }
        const { token } = jwtAuth
        console.log('token: ', token);
        req.token = jwt.verify(token, SECRET);
        next();

    } catch (err) {
        console.error(err);
        res
            .status(401)
            .json({
                ok: false,
                message: 'ERROR: you need to be logged in'
            });
    }
}
  • Now error is "missing token", but console.log still displays correct token, so your solution only change error message. To be sure I also check if displayed token correspond to console.log – Bader Jan 05 '23 at 23:13
  • The console.log for the token is coming from elsewhere in your application, but here `jwtAuth` is undefined. You can see this by moving this console.log statement above the if-statement check and console.logging jwtAuth instead of token – Live bug help - www.dialect.so Jan 05 '23 at 23:15
  • It's sound impossible, but I change `console.log('token: ', token)` into `console.log('test: ', token)` to check if this console.log comes from elsewhere and now my applications prints `test: (token)` – Bader Jan 06 '23 at 12:42