【问题标题】:I am trying to update a user using jwt token in postman and i am getting this error (cannot read property id of undefined)我正在尝试在邮递员中使用 jwt 令牌更新用户,但出现此错误(无法读取未定义的属性 ID)
【发布时间】:2021-12-28 14:54:09
【问题描述】:

我在 youtube 上使用 lama dev 尝试此代码。我在邮递员上收到这个错误 我复制访问令牌并在我使用它时显示(令牌无效),但与用户的令牌相同,就像视频一样。

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

我不知道如何解决它,如果问题是代码或者我不知道如何使用邮递员。 我是代码新手

这是名为 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;

【问题讨论】:

  • 你能分享一下你对邮递员的要求吗?
  • 你能找到解决办法吗?
  • 我还没有尝试,但我会的,我想我在语法上有错误

标签: node.js jwt postman


【解决方案1】:

我觉得这部分有问题:

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(" ") 看起来有点可疑。为什么有这么多空间?你确定这样可以吗?

【讨论】:

    【解决方案2】:

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

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

    我猜这可能是由 next() 函数引起的,但我查看了文档并找不到原因。
    如果它不起作用,请尝试杀死您的节点进程

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 2022-06-19
      • 1970-01-01
      • 2021-07-05
      • 2018-09-19
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多