对于模型 XXX 的路径 XXX 处的值 XXX,转换为 ObjectId 失败

Cast to ObjectId failed for value XXX at path XXX for model XXX

我有一个简单的 用户模型 和一个名为 bio 的 属性,如下所示:

const userSchema = new mongoose.Schema{
   bio:{
            type: String,
            max: 150,
            default: "Welcome to my linktree!"
        }
}

我有一个编辑生物的功能如下:

exports.editBio = async (req, res) => {

    User.findByIdAndUpdate({_id: req.user._id}, {bio: req.body}, (err,data) => {
        if(err){
            res.json(err)
        }else{
            res.json(`Bio updated`)
        }
    })
}

但是,我一直收到错误消息:

{
    "stringValue": "\"bio\"",
    "valueType": "string",
    "kind": "ObjectId",
    "value": "bio",
    "path": "_id",
    "reason": {},
    "name": "CastError",
    "message": "Cast to ObjectId failed for value \"bio\" (type string) at path \"_id\" for model \"User\""
}

我该如何解决这个问题?

这是我问题的答案:-

之前的路线顺序是:

router.put('/:id/edit/:linkId', isLoggedIn, isAuthenticated, editLink)
router.put('/:id/edit/bio', isLoggedIn, isAuthenticated, editBio)

我先调换了这些路由的顺序(在网上搜索了一些类似的问题后,似乎可行)。新的路线顺序:

router.put('/:id/edit/bio', isLoggedIn, isAuthenticated, editBio)
router.put('/:id/edit/:linkId', isLoggedIn, isAuthenticated, editLink)

然后我编辑了我的 editBio 函数(代码如下):

exports.editBio = async (req, res) => {

    var input = JSON.stringify(req.body);

    var fields = input.split('"');

    var newBio = fields[3];

    if(newBio.length > 150){
        return res.json(`Bio cannot be more than 150 characters`)
    }else{
        try {
            await User.findByIdAndUpdate(req.user._id, { bio: newBio });
            res.json(`Bio updated`)
        }catch (err) {
            res.json(err)
        }
    }

}