【问题标题】:Cannot read properties of undefined (reading 'id')无法读取未定义的属性(读取“id”)
【发布时间】:2022-01-15 17:35:04
【问题描述】:

我有一个 auth.js 文件和一个名为 fetchuser 的中间件,代码如下所示 谁能告诉我为什么会出现这个错误。

我正在使用 express js 和猫鼬,但是在向用户发送令牌并验证用户是否已登录时发生此错误。

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'); // it is used for password hashing 
const jwt = require('jsonwebtoken');
const fetchuser=require('../middleware/fetchuser');

// Route:1 - Create a User using :POST.  "/api/auth/createuser".   NO Login Required.
router.post('/createuser', [
  body('email', 'Enter valid email').isEmail(),
  body('name', 'Enter valid email').isLength({ min: 3 }),
  body('password').isLength({ min: 5 })
], async (req, res) => {
  // Check fo vaidation whether is any rule(defined in User model) breaked or not
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  // Check Whether user with same email id exist or not
  try {
    let user = await User.findOne({ email: req.body.email });
    if (user) {
      return res.status(400).json({ error: "Sorry user with same email id already exist" });
    }

    // hashing of password
    const salt = await bcrypt.genSalt(10);
    const securePassword = await bcrypt.hash(req.body.password, salt);

    // create A new User
    user = await User.create({
      name: req.body.name,
      email: req.body.email,
      password: securePassword
    })

    // returning user id in Token
    const JWT_secret = "Rishiisa@boy";
    const data = { user:{id: user.id} };
    const auth_token = jwt.sign(data, JWT_secret);
    res.json({ auth_token });
  }
  catch (error) {
    console.error(error.message);
    res.status(500).send("Internal server error");
  }
})


// Route:2 - Login a User using credential.  "/api/auth/login".   NO Login Required.
router.post('/login', [
  body('email', 'Enter valid email').isEmail(),
  body('password', 'password can not be blank').exists(),
], async (req, res) => {
  // Check for vaidation according to the rule defined at line no. 53, 54;
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  // destructure the email and password from body request
  const { email, password } = req.body;

  try {
    // Checking whether email is exist or not 
    let user = await User.findOne({ email });
    if (!user) {
      return res.status(400).json({ error: "Please try to login using correct credentials" });
    }

    // Now Comparing password with help of bcryptjs
    const comparepassword = await bcrypt.compare(password, user.password);
    if (!comparepassword) {
      return res.status(400).json({ error: "Please try to login using correct credentials" });
    }

    // Now if user enter coorect password and login then user got logged in;
    // And We will send authtoken to user;
    // returning user id in Token
    const JWT_secret = "Rishiisa@boy";
    const data = { user:{id: user.id} };
    const auth_token = jwt.sign(data, JWT_secret);
    res.json({ auth_token });
  }
  catch (error) {
    console.error(error.message);
    res.status(500).send("Internal server error");
  }

})


// Route:3 - Get Loggedin User details using:POST  "/api/auth/getuser"  Login required
router.post('/getuser', fetchuser, async (req, res) => {
  try {
    const 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

中间件: fetchuser.js

const jwt = require('jsonwebtoken');
const JWT_secret = "Rishiisa@boy";

const fetchuser = (req, res, next) => {
  // Get the user from jwt token and add user 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;

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    在 auth.js 中,您在其中写道:“const data = { user:{id: user.id} };”尝试将 user.id 更改为 user._id,因为在 MongoDB 中,用户 id 被称为“_id”。

    让我知道这是否有效。

    我在发送 jwt 令牌甚至验证它时遇到了问题,但现在一切都很好。

    另外,下面是我的(受启发的)方法:

    router.post('/register', (req, res)=>{
        const { username, password } = req.body;
    
        const user = new User({
            username,
            password
        });
    
        bcrypt.genSalt(10, (err, salt)=>{
            bcrypt.hash(user.password, salt, (err, hash)=>{
                if(err) throw err;
                user.password = hash;
                user.save()
                    .then(user=>{
    
                        jwt.sign(
                            { id: user._id },
                            process.env.jwtSecret,
                            { expiresIn: 3600 },
                            (err, token) =>{
                                if(err) throw err;
                                res.status(200)
                            }
                        )
    
                        
                    })
            })
        })
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2018-10-01
      • 2021-06-27
      • 2021-05-20
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多