当我尝试获取 cookie 时,它给我错误 -> TypeError: Cannot read property 'token' of undefined

问题描述 投票:0回答:2

我创建了 jwt 令牌,如下所示:

const jwt = require('jsonwebtoken');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
 
const userSchema = new mongoose.Schema({
    firstName: {
        type: String,
        required:true
    },
    lastName: {
        type: String,
        required:true
    },
    email: {
        type: String,
        required:true
    },
    password: {
        type: String,
        required:true
    },
    tokens:[
        {
            token: {
                type: String,
                required:true
            }
        }
    ]
});

userSchema.methods.generateAuthToken = async function () {
    try{

        let token = jwt.sign({_id: this._id}, process.env.SECRET_KEY);
        this.tokens = this.tokens.concat({token: token});
        await this.save();
        return token;
    }catch(err) {
        console.log(err);
    }
}

const User = mongoose.model('USER', userSchema);

module.exports = User;

并在用户成功登录时以 cookie 格式保存此令牌,如下所示:

const jwt = require('jsonwebtoken');
const express = require('express');
const bcrypt = require('bcrypt');
const router = express.Router();
const app = express();
const cookieParser = require('cookie-parser');

const userAuthenticate = require("../middleware/UserAuthenticate");

require('../db/conn');
const User = require("../model/userSchema");
 
    router.post('/signin', async (req, res) => {
        try{
            const {email, password} = req.body;
    
            if(!email || !password){
                return res.status(400).json({error: "please fill the data"});
            }
    
            const userLogin = await User.findOne({ email: email });
    
            if(userLogin){
                const isMatch = await bcrypt.compare(password, userLogin.password);
    
                const token = await userLogin.generateAuthToken();
    
                res.cookie('signintoken', token, {
                    expires:new Date(Date.now() + 25892000000),
                    httpOnly:true
                });
    
                if(!isMatch){
                    res.status(400).json({error: "user invalid pass"});
                }else{
                    res.json({ message: "user signin successfully"});
            }            
            }else{
                res.status(400).json({error: "user invalid"});             
            }
            
        } catch(err){
             console.log(err);  
            }
    });

将 jwt 令牌作为 cookie 存储在网站上后,我想在我的 JS 中获取 cookie,如下所示:

router.get('/userprofile', userAuthenticate, async (req, res) =>{
    res.send(req.rootUser);
    console.log(req.token) // it gives error as I mentioned below.
});

这是我上面提到的 userAuthenticate 函数的代码,作为获取 cookie 的中间件:

const Express = require('express');
const jwt = require('jsonwebtoken');
const User = require("../model/userSchema");
const dotenv = require('dotenv');
const app = Express();

dotenv.config({path: './config.env'});

const cookieParser = require('cookie-parser');
app.use(cookieParser());

const UserAuthenticate = async (req, res, next) => {
    try{
        const token = req.cookies.signintoken;
        console.log(token); // it prints 'undefined' on console.
        const verifyToken = jwt.verify(token, process.env.SECRET_KEY);

        const rootUser = await User.findOne({_id: verifyToken._id, "tokens.token": token });

        if(!rootUser) { 
            throw new Error('User not found');
        }       
        else{
            res.status(500).send('user found');
        }

        req.token = token;
        req.rootUser = rootUser;
        req.userID = rootUser._id;

        next();

    }catch(err){
        res.status(401).send('Unauthorized: No token provided');
        console.log(err);
    }
}

module.exports = UserAuthenticate;

当我尝试获取 cookie 时,

我的邮递员回复是:

{ Unauthorized: No token provided }

我的控制台 o/p 是:

TypeError: Cannot read property 'signintoken' of undefined
    at UserAuthenticate (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\middleware\UserAuthenticate.js:15:35)
    at Layer.handle [as handle_request] (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\layer.js:95:5)
    at D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\index.js:341:12)
    at next (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\index.js:174:3)
    at router (D:\Web Development Projects\Web_Projects\MERN Projects\hotdeals\backend\node_modules\express\lib\router\index.js:47:12)
node.js express cookies token
2个回答
1
投票

在您的路由器文件中,写入以下内容:

const cookieParser = require("cookie-parser")

然后添加:

router.use(cookieParser());

并从您的 App.js 文件中删除相同的代码。


0
投票

它无法读取“cookies”的属性

© www.soinside.com 2019 - 2024. All rights reserved.