【问题标题】:I am getting this error TypeError: Cannot read properties of undefined (reading 'header') , I am trying to middleware to get users data我收到此错误 TypeError: Cannot read properties of undefined (reading 'header') ,我正在尝试使用中间件获取用户数据
【发布时间】:2022-01-06 13:13:26
【问题描述】:

我在其中创建了一个中间件文件夹我已经创建了 fetchuser.js 这是我的 fetchuser.js 代码,我创建了 getuser 端点,以便我可以对用户进行身份验证。 我在我的 Thunderclient 中创建了一个新的发布请求,但由于这个错误,我无法做任何事情

...

const jwt = require('jsonwebtoken');
const JWT_SECRET = "Saurabhisgood$ouy";


const fetchuser = (req, res, next) => {
    // Get the user from jwt token and id to req object
 const token = req.header('auth-token');
    if (!token) {
        res.status(401).send({ error: "Please authenticate using a valid token" })
    }
    try {
        const data = jwt.verify(token, JWT_SECRET)
        req.user = data.user;
        next();
    } catch (error) {
        res.status(401).send({ error: "Please authenticate using a valid token" })
    }
}





module.exports = fetchuser();

...

这是 auth.js 文件

...

const express = require('express');
const User = require('../models/User');
const router = express.Router();
const { body, validationResult } = require('express-validator');
const bcrypt = require('bcryptjs');
const JWT_SECRET = "Saurabhisgood$ouy";
const jwt = require('jsonwebtoken');
const fetchuser = require('../middleware/fetchuser');

// Create a user using : POST "/api/auth/createuser". Doesn't require auth. Dosen't require login

router.post('/createuser', [
    body('name', 'Name should be atleast 3 characters').isLength({ min: 3 }),
    body('email', 'Email should be unique').isEmail(),
    body('password', 'Password must be atleast 5 characters').isLength({ min: 5 }),

], async (req, res) => {
    // If there are errors then you will get bad request
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }

    // Check whether the user with the same email exists
    try {
        let user = await User.findOne({ email: req.body.email });
        if (user) {
            return res.status(400).json({ error: "The user with this email already exists" })
        }
        const salt = await bcrypt.genSalt(10);
        const secPass = await bcrypt.hash(req.body.password, salt);
        // Create a new user
        user = await User.create({
            name: req.body.name,
            email: req.body.email,
            password: secPass
        });
        const data = {
            user: {
                id: user.id
            }
        }
        const authToken = jwt.sign(data, JWT_SECRET);
        // console.log(jwtData);
        // res.json(user);
        res.json({authToken});
    } catch (error) {
        console.error(error.message);
        res.status(500).send("Internal server error")
    }

})

// Authenticate a user using : POST "/api/auth/login". Doesn't require auth. Dosen't require login
router.post('/login', [
    body('email', 'Email should be unique').isEmail(),
    body('password', 'Password cannot be blank').exists(),

], async (req, res) => {
    // If there are errors then you will get bad request
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    };
    
    const  { email, password } = req.body;

    // Check whether the user with the same email exists
    try {
        let user = await User.findOne({email});
        if (!user) {
            return res.status(400).json({ error: "Please enter the valid credentials" })
        }
        const passwordComapare=  await bcrypt.compare(password, user.password);
           if (!passwordComapare) {
            return res.status(400).json({ error: "Please enter the valid credentials" })
        }
        const data = {
            user: {
                id: user.id
            }
        }
        const authToken = jwt.sign(data, JWT_SECRET);
        // console.log(jwtData);
        // res.json(user);
        res.json({authToken});
    } catch (error) {
        console.error(error.message);
        res.status(500).send("Internal server error")
    }

})

// Get details of  logged in  user using : POST "/api/auth/getuser". Require login
router.post('/getuser', fetchuser , async (req, res) => {
   
    try {
        userId= req.user.id;
        const user= await User.findById(userId).select("-password");
        res.send(user);
    } catch (error) {
        console.error(error.message);
        res.status(500).send("Internal server error")
    }

})



module.exports = router

...

【问题讨论】:

    标签: node.js reactjs express


    【解决方案1】:

    您自动调用中间件,更改:

    module.exports = fetchuser();
    

    到:

    module.exports = fetchuser;
    

    【讨论】:

    • 感谢成功!
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2021-11-03
    • 2021-11-08
    • 2022-12-16
    • 2022-08-07
    相关资源
    最近更新 更多