首页 > 解决方案 > CastError:对于模型 \"students\"" 的路径 \"_id\" 中的值 \"undefined\"(类型字符串),转换为 ObjectId 失败

问题描述

所以我在使用 Node JS、Express 和 Mongo DB 的 CRUD 应用程序中遇到了问题。实际上,我只是在关注本教程,但我被困在 UPDATE 部分。我已经能够从数据库中创建、读取和删除值,但是我不知道为什么每当我尝试更新我的数据时总是会收到此错误。

我发现错误来自我的 controller.js 文件,代码如下:

exports.update = (req,res)=>{
    if(!req.body){
        return res
        .status(400)
        .send({message:"Record to be updated can not be empty!"})
    }
     
    const id = req.params.id;
    studentDb.findByIdAndUpdate(id,req.body,{userFindAndModify:false})
    .then(data=>{
        if(!data){
            res.status(404).send({message:`Cannot update student record with ID ${id}. Maybe record not found.`})
        }else{
            res.send(data)
        }
    })
    .catch(err=>{
        res.status(500).send({message:`Error in updating student record with id=${id}.` + err})
    })
}

我的假设是 objectID 出现在我的架构中的第一个模型上,因为每当我在运行应用程序时检查控制台时,我的架构中模型的最后一个值,“联系人”都未定义。

错误:

在此处输入图像描述

在此处输入图像描述

如果我的问题仍然不清楚,我可以提供与此相关的其他代码。预先感谢您的回答!我已经被困在这里几个小时了。

编辑

这是附加的前端代码(这是我的 update_student.ejs 中更新数据的 FORM 部分):

<!-- form handling -->
            <form method="POST" id="update_student">
                <div class="new_student">
                    <div class="form-group">
                        <div class="row">
                        <div class="col-lg-4">
                            <label for="firstName" class="text-muted">First Name</label><br>
                            <input type="hidden" name="id" value="<%=students._id%>">
                            <input type="text" name="firstName" value="<%=students.firstName%>" placeholder="Corki">
                        </div>
                        <div class="col-lg-4">
                            <label for="middleName" class="text-muted">Middle Name</label><br>
                            <input type="text" name="middleName" value="<%=students.middleName%>" placeholder="Vi">
                        </div>
                        <div class="col-lg-4">
                            <label for="lastName" class="text-muted">Last Name</label><br>
                            <input type="text" name="lastName" value="<%=students.lastName%>" placeholder="Fortune">
                        </div> 
                        </div>   
                    </div>
                    <div class="form-group">
                        <div class="row">
                            <div class="col-sm-4">
                                <label for="gender" class="text-muted">Gender</label><br>
                                <div class="radio inline">
                                    <input type="radio" id="radio-2" name="gender" value="Male" <% if(students.gender == "Male"){ %>checked <% } %>>
                                    <label for="radio-2" class="radio-label">Male</label>
                                </div>
                                <div class="radio inline">
                                    <input type="radio"id="radio-3" name="gender" value="Female" <% if(students.gender == "Female"){ %>checked <% } %>>
                                    <label for="radio-3" class="radio-label">Female</label>
                                </div>
                            </div>
                            <div class="col-md-8">
                                <div class="form-group">
                                    <label for="birthday" class="text-muted">Birthday</label>
                                    <input type="text" name="birthday" value="<%=students.birthday%>" placeholder="MM/DD/YYYY">
                                </div>
                            </div>
                        </div>
                    </div>                        
                    <div class="form-group">
                        <div class="row">
                            <div class="col-md-6">
                                <label for="program" class="text-muted">Program</label>
                                <input type="text" name="program" value="<%=students.program%>" placeholder="i.e. BSIT">
                            </div>
                            <div class="col-md-6">
                                <label for="yearLevel" class="text-muted">Year Level</label>
                                <select class="form-select" name="yearLevel">
                                    <option value="">Select year level</option>
                                    <option <% if(students.yearLevel == "First Year"){ %>selected <% } %> value="First Year">First Year</option>
                                    <option <% if(students.yearLevel == "Second Year"){ %>selected <% } %> value="Second Year">Second Year</option>
                                    <option <% if(students.yearLevel == "Third Year"){ %>selected <% } %> value="Third Year">Third Year</option>
                                    <option <% if(students.yearLevel == "Fourth Year"){ %>selected <% } %> value="Fourth Year">Fourth Year</option>
                                    <option <% if(students.yearLevel == "Fifth Year"){ %>selected <% } %> value="Fifth Year">Fifth Year</option>
                                    <option <% if(students.yearLevel == "Masteral"){ %>selected <% } %> value="Masteral">Masteral</option>
                                </select>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="email" class="text-muted">Email</label>
                        <input type="text" name="email" value="<%=students.email%>" placeholder="example@gmail.com">
                    </div>
                    <div class="form-group">
                        <label for="address" class="text-muted">Address</label>
                        <input type="text" name="address" value="<%=students.address%>" placeholder="Household No., Barangay, City, Province">
                    </div>
                    <div class="form-group">
                        <label for="contact" class="text-muted">Contact</label>
                        <input type="text" name="contact" value="<%=students.contact%>" placeholder="i.e 09XX-XXX-XXXX">
                    </div>
            
                    <div class="form-group">
                        <button type="submit" class="btn text-dark update">Save</button>
                    </div>
            
                </div>
            </form>
            <!-- form handling -->

我的#update_student JS 代码以防万一:

$('#update_student').on("submit",(function(event){
    event.preventDefault();

    var unindexed_array = $(this).serializeArray();
    var data = {}
    $.map(unindexed_array,function(n,i){
        data[n['firstName']] = n['value']
    })
    console.log(data);

    var request={
        "url": `http://localhost:1485/api/students/${data.id}`,
        "method":"PUT",
        "data" : data
    }
    $.ajax(request).done(function(response){
        alert("Data updated successfully!");
    })
}))

标签: node.jsmongodbexpress

解决方案


感谢 @Rajdeep Debnath 爵士的帮助,我能够从我的 console.log 中查看 may "unindexed_array" 并发现data[n['firstName']] = n['value'] 我应该写而不是data[n['name']] = n['value']

我写前者是因为我认为它只是变量的名称,但实际上,它就像 JavaScript 中调用的“id”或“class”。该表单在输入中使用了“名称”(例如<input type="text" name="program" value="<%=students.program%>" placeholder="i.e. BSIT">我的代码),这就是为什么它是在函数中调用的表单。

现在我的#update_student JS 代码如下所示:

$('#update_student').on("submit",(function(event){
    event.preventDefault();

    var unindexed_array = $(this).serializeArray();
    var data = {}
    $.map(unindexed_array,function(n,i){
        data[n['name']] = n['value']
    })
    console.log(data);

    var request={
        "url": `http://localhost:1485/api/students/${data.id}`,
        "method":"PUT",
        "data" : data
    }
    $.ajax(request).done(function(response){
        alert("Data updated successfully!");
    })
}))

推荐阅读