node.js - 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!");
})
}))
解决方案
感谢 @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!");
})
}))
推荐阅读
- arrays - 在数组 C Lang 中找到一对数字的最小值
- vim - 为 vim 编辑器定义默认文本
- java - Listview自定义适配器多项选择
- reactjs - 当 useState 钩子更改状态时,React.js 组件不会重新渲染子组件
- node.js - Mongoose Model.schema.path() 返回一个意外的对象
- php - 未定义的$链接?“mysqli_prepare() 期望参数 1 是..”
- sql - PostgreSQL SQL 查询返回所有图形节点(连接的组件),提供一个节点来查询
- android - Jetpack Compose 中的作用域状态
- java - 使用 JMenuBar 制作 JFrame 全屏打开
- html - Socket.IO 适用于某些计算机但不适用于其他计算机?