我昨晚问了一个类似的问题,几乎没有得到任何意见和回复。所以我再次尝试运气,因为我不能解决这个问题并继续我的项目过去两天!
昨天提到了问题的链接:Mongoose - No matching document found (ForEach)
基本上,我的客户端上有一个表,它有一个行id和按钮来更新和删除该行。单击更新按钮后,它会将行ID发送到服务器并执行PUT请求,该请求完美无缺。该问题来自我点击的另一行,它会同时更新前一行和新单击的行,并使用相同的新数据。
我已经上传了一个YouTube视频来解释这个问题,以防万一我在这里没有解释清楚:https://www.youtube.com/watch?v=G8sAP3AONYI
这是我的代码:(我已将github链接添加到项目中):
User.js(型号)
local: {
...,
education: [{
id: String,
degree: String,
institute: String,
dates: String,
description: String
}],
...
}
router.js
app.put('/put_education/:id', function(req, res) {
var row_id = req.params.id; //get education id from table row
//get the current logged in user
User.findById(req.user._id, function (err, doc) {
if (err) {
console.log('no entry found');
}
//match the table row id with the id in users education model
doc.local.education.forEach(function (education, index) {
console.log(education.id + " " + row_id);
//if rows match, replace the database document with values from client
if(education.id === row_id){
doc.local.education[index] = req.body;
doc.save(function (err) {
if (err) {
console.log(err);
} else {
res.send("Success");
}
});
}
});
});
});
客户端javascript
//when edit button on row clicked, change 'save' button to 'update' inside the model
$('#education_body').on('click', '.edit_education', function() {
var row_id = get_row_id(this);
$("#education_save_button").hide();
$("#education_update_button").show();
//when update button clicked inside the model, call PUT in server
$('#education_form').on('click', '#education_update_button', function (event) {
event.preventDefault();
$.ajax({
url: '/put_education/' + row_id,
method: 'PUT',
contentType: 'application/json',
data: JSON.stringify({
id: $('input[name="education_id"]').val(),
degree: $('input[name="education_degree"]').val(),
institute: $('input[name="education_institute"]').val(),
dates: $('input[name="education_dates"]').val(),
description: $('textarea[name="education_description"]').val()
}),
success: function (response) {
initialize(); //function to fill in all textfields values from db
$("#education_saved").show().delay(3000).fadeOut();
}
});
//change 'update' button back to 'save'
$("#education_save_button").show();
$("#education_update_button").hide();
});
});
请参阅我之前的问题,看看错误的图像以及究竟发生了什么......
我想在id匹配之后打破循环,但是foreach循环没有中断函数,我把它改为正常for循环但它仍然给我同样的错误。所以我不认为打破循环是一个答案..
Github:https://github.coventry.ac.uk/salmanfazal01/304CEM-Back-End
提前致谢:)
答案 0 :(得分:0)
我通过将内部click()函数与外部函数分开来解决它。不确定为什么我的初始代码不起作用,但这解决了它。