Suvam Ray
Suvam Ray

Reputation: 11

Cannot read property 'jwtoken' of undefined

here I generate the token at backend in express ..............

router.post("/login",async(req,res)=>{
    const {email,password}=req.body;
    if(!email || !password){
        return res.status(401).send({error:"please filled the data properly"});
    }
    try {
        const loginUser=await User.findOne({email:email});
        if(!loginUser){
            return res.status(400).send({error:"not found"});
        }
        const isMatch = await bcrypt.compare(password,loginUser.password);    
        if(isMatch){
            const token=await loginUser.generateToken();
            res.cookie("jwtoken",token,{
                expires:new Date(Date.now()+15000000),
                httpOnly:true,
                //secure:true  //it is applicable when we use https method
            })
            console.log(token);
            res.send({message:"login success"});
        }else{
            res.status(400).send({error:"please enter correct data"})
        }
          
    } catch (error) {
        res.status(400).send(error)
    }
})

the token is create when i login in brouser

here is the about page (react) ...................

const verifyPage=async()=>{
    try{
        const res=await fetch('/about',{
            method:"GET",
            headers:{
                Accept:"application/json",
                "Content-Type":"application/json"
            },
            credentials:"include"
        });
        const data=await res.json();
        console.log(data);
        
        if(!res.status===200){
            const err=new Error(res.error);
            throw err;
        }
    }catch(err) {
        console.log(err);
        history.push("/login");
    }
}

useEffect(()=>{
    verifyPage();
},[])

.............

here I verify the token ...........

router.get("/about",Authentication,(req,res)=>{
res.send(req.rootUser);
})

........ The authentication page ............

    const jwt = require("jsonwebtoken")
const User=require("../models/shegma")

const Authentication=async (req,res,next)=>{
    try{
        const token=req.cookies.jwtoken;
        console.log(token)
        const verifyToken=jwt.verify(token,process.env.TOKENID);
        console.log(verifyToken);
        const rootUser=await User.findOne({_id:verifyToken._id,"tokens.token":token})
        if(!rootUser){throw new Error("user not found")}
        req.token=token;
        req.rootUser=rootUser;
        req.userID=rootUser._id;
        next();
    }catch(err){
        res.status(401).send("no token found");
        console.log(err);
    }
}
module.exports=Authentication;

..........

here is the error ......

TypeError: Cannot read property 'jwtoken' of undefined at Authentication (C:\Users\ASUS\Desktop\mern\server\middleware\Authentication.js:6:33) at Layer.handle [as handle_request] (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\layer.js:95:5) at C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\index.js:335:12) at next (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\index.js:275:10) at Function.handle (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\index.js:174:3) at router (C:\Users\ASUS\Desktop\mern\server\node_modules\express\lib\router\index.js:47:12)

Upvotes: 0

Views: 4050

Answers (3)

Mondeep
Mondeep

Reputation: 1

This also works:

const router = express.Router()

const cookieParser = require("cookie-parser")
router.use(cookieParser())

Upvotes: 0

Somenath Choudhury
Somenath Choudhury

Reputation: 172

At first, you need to install cookie-parser inside your server folder

npm i cookie-parser

Then, require cookie-parser inisde that .js file where you have initialized express

const cookieParser = require('cookie-parser')

After this, below const app = express(); just write

app.use(cookieParser())

Here is the full code:-

const express = require('express');
const cookieParser = require('cookie-parser')

const app = express();

app.use(cookieParser())

Upvotes: 4

devdevbevbev
devdevbevbev

Reputation: 21

Do you happen to be parsing the cookies on the incoming request anywhere in your express code?

The req.cookies object being undefined leads me to believe you may not be parsing the request for cookies or that the parsing is not happening before the Authentication handler is called.

For reference: express cookie-parser

Upvotes: 2

Related Questions