簡體   English   中英

收到錯誤“無法讀取未定義的屬性(讀取'id')”

[英]Getting an error "Cannot read properties of undefined (reading 'id') "

我正在為我的后端 API 創建一個 webtoken 並更新我的數據庫。 即使給它的令牌和 ID 是正確的,它也會在 POSTMAN 中返回錯誤“令牌無效”。 當我檢查控制台時,它顯示一個錯誤,指出“TypeError:無法讀取未定義的屬性(讀取'id')”。它的代碼如下所示。

const jwt = require("jsonwebtoken");

const verifyToken = (req, res, next) => {
  const authHeader = req.headers.token;
  if (authHeader) {
    const token = authHeader.split("")[1];
    jwt.verify(token, process.env.JWT_SEC, (err, user) => {
      if (err) res.status(403).json("Token is not valid!");
      req.user = user;
      next();
    });
  } else {
    return res.status(401).json("YOu are not authenticated!");
  }
};
const verifyTokenAndAuthorization = (req, res, next) => {
  verifyToken(req, res, () => {
    if (req.user.id === req.params.id || req.user.isAdmin) {
      next();
    } else {
      res.status(403).json("You are not allowed to do that!");
    }
  });
};

module.exports = { verifyToken,verifyTokenAndAuthorization };



用戶模塊的代碼如下

const User = require("../models/User.js");
const { verifyTokenAndAuthorization } = require("./verifyToken.js");
const router = require("express").Router();

//UPDATE
router.put("/:id", verifyTokenAndAuthorization, async (req, res) => {
  if (req.body.password) {
    req.body.password = CryptoJS.AES.encrypt(
      req.body.password,
      process.env.PASS_SEC
    ).toString();
  }
  try {
    const updatedUser = await User.findByIdAndUpdate(
      req.params.id,
      { $set: req.body, },
      { new: true }
    );
    res.status(200).json(updatedUser)
  } catch (err) {
    res.status(500).json(err);
  }
});
module.exports = router;

在您的verifyToken() function 中,您調用另一個 function jwt.verify() ,如下所示:

jwt.verify(token, process.env.JWT_SEC, (err, user) => {
      if (err) res.status(403).json("Token is not valid!");
      req.user = user;
      next();
    });

發生的事情是jwt.verify()發現了一個錯誤。 因此,當它調用您的回調 function 時:

(err, user) => {
      if (err) res.status(403).json("Token is not valid!"); // this is the problem!
      req.user = user;
      next();
    }

您是說如果有錯誤,請發送 403 響應。好的。 但是在此之后沒有什么能阻止您的代碼運行。 所以你已經發送了 403 響應,但仍在設置req.user = user (可能未定義)並調用next()

什么是next() 您已將 next 定義為:

() => {
    if (req.user.id === req.params.id || req.user.isAdmin) {
      next();
    } else {
      res.status(403).json("You are not allowed to do that!");
    }
  }

因此req.user未定義,您正在嘗試查看是否req.user.id === req.params.id 在運行時這實際上等同於undefined.id === req.params.id

簡而言之,您需要確保正確退出代碼。 一個簡單的解決方案是對您當前的代碼進行小改動:

jwt.verify(token, process.env.JWT_SEC, (err, user) => {
      if (err) {
        // Could throw an error here, catch and then send the response too.
        res.status(403).json("Token is not valid!"); 
      } else {
         req.user = user;
         next();
      }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM