我试图在poster中使用jwt令牌更新一个用户,但我收到了这个错误(无法读取未定义的属性id)



我在youtube上使用lama-dev尝试了这段代码。我在邮递员那里收到了这个错误我复制访问令牌,当我使用它时,它会显示(令牌无效(,但与用户和视频是相同的令牌。

当我在终端中查看时,它显示(无法读取未定义的属性id(或无法读取未确定的属性isAdmin(

如果问题出在代码上,或者我不知道如何使用poster,我不知道该如何解决。我是代码的新手

这是名为verifytoken.js的路由文件

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");
}
});
};
const verifyTokenAndAdmin = (req,res,next) => {
verifyToken(req,res,()=> {
if( req.user.isAdmin) {
next();
} else {
res.status(403).json("your are not the admin ");
}
});
};
module.exports = {verifyToken, verifyTokenAndAuthorization, verifyTokenAndAdmin};
  • 这是名为user.js的路由文件*

const User = require("../models/User")
const { verifyToken, verifyTokenAndAuthorization, verifyTokenAndAdmin} = require("./verifyToken");

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);
}
});
//DELETE 
router.delete("/:id", verifyTokenAndAuthorization, async (req,res)=>{
try {
await User.findByIdAndDelete(req.params.id)
res.status(200).json("user has been deleted");
}catch(err){
res.status(500).json(err)
}
})
//GET USER
router.get("/find/:id", verifyTokenAndAdmin, async (req,res)=>{
try {
const user = await User.findById(req.params.id);
const { password, ...others } = user._doc;
res.status(200).json(others);
}catch(err){
res.status(500).json(err)
}
})
module.exports = router;

我认为这部分有一个问题:

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");
}

此行:if(err) res.status(403).json("token is not valid");

您将状态设置为403,但继续执行代码。因此,即使您的令牌无效,您仍然可以调用next回调并尝试读取req.user。所以我的猜测是你的代币出了问题。出现错误时应立即返回:if(err) return res.status(403).json("token is not valid");

此外,split(" ")看起来有点可疑。为什么有这么多空间?你确定这样可以吗?

我遇到了同样的问题,使用if-else语句可以解决这个问题
express doc示例如下所示。

if(err) { 
res.status(403).json('Token is not valid');
} else { 
req.user = user; 
next();
}

我想这可能是由next((函数引起的,但我已经查看了文档,却找不到原因
如果不起作用,请尝试终止节点进程

在auth.js文件中,更改:

user && res.status(401).json("Wrong Credentials!");

收件人:

if (!user) {
res.status(401).json("Wrong Credentials!");
return;
}

请在顶部插入以下行;

const CryptoJS = require("crypto-js");

相关内容

最新更新