[英]Getting error in reactjs TypeError: Cannot read properties of undefined (reading 'filter')
[英]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.