Nodejs mogoose更新记录时出错
Nodejs mogoose更新记录时出错
用put方式更新记录,尝试了用model以及entity的方式去更新一条记录,都提示: Cannot PUT /tasks/5302d2c84aba6c637352e435 其余我写的增加,删除记录都没问题,但是就是更新的时候不行。 大致的代码如下: mongoose.connect(‘mongodb://localhost/todo_development’); var Schema = mongoose.Schema; var ObjectId = Schema.ObjectId;
var TaskSchema = new Schema({ task: String });
var TaskModel = mongoose.model(‘Task’, TaskSchema);
app.get(’/tasks/:id/edit’, function(req, res){ TaskModel.findById(req.params.id, function(err, doc){ res.render(‘tasks/edit’, { title: ‘Edit Task View’, task: doc }); }); });
app.post(’/tasks’, function(req, res){ var task = new TaskModel(req.body.task); task.save(function (err){ if(!err) { res.redirect(’/tasks’); } else{ res.redirect(’/tasks/new’); } }); });
app.put(‘tasks/:id’, function(req, res){ TaskModel.findById(req.params.id, function(err, doc){ doc.task = req.body.task.task; var _id = doc._id; delete doc._id TaskModel.update({_id:_id}, doc,function(err) { if(!err) { res.redirect(’/tasks/new’); } else { //error handling } }); }); });
app.del(’/tasks/:id’, function(req, res) { TaskModel.findById(req.params.id, function(err, doc){ if (!doc) return next(new NotFound(‘Document not found’)); doc.remove(function() { res.redirect(’/tasks’); }); }); });
在Node.js中使用Mongoose更新数据库记录时遇到错误,可能是由于多种原因引起的。根据你提供的代码,主要问题可能出现在app.put('/tasks/:id', ...)
路由处理函数中。让我们逐步分析并修正这个问题。
问题分析
- 使用
findById
后直接更新:在找到文档后,直接修改文档属性然后使用update
方法可能会导致问题,因为update
方法期望的是一个查询条件对象和一个更新对象。 - 删除
_id
字段:在更新之前删除_id
字段会导致更新操作失败,因为_id
是必需的。
解决方案
我们可以使用findOneAndUpdate
方法来简化更新过程,并确保正确地更新文档。
修改后的代码
mongoose.connect('mongodb://localhost/todo_development');
var Schema = mongoose.Schema;
var TaskSchema = new Schema({
task: String
});
var TaskModel = mongoose.model('Task', TaskSchema);
app.get('/tasks/:id/edit', function(req, res) {
TaskModel.findById(req.params.id, function(err, doc) {
if (err) {
console.error(err);
return res.status(500).send('Error finding the document');
}
res.render('tasks/edit', {
title: 'Edit Task View',
task: doc
});
});
});
app.post('/tasks', function(req, res) {
var task = new TaskModel(req.body.task);
task.save(function(err) {
if (!err) {
res.redirect('/tasks');
} else {
res.redirect('/tasks/new');
}
});
});
app.put('/tasks/:id', function(req, res) {
TaskModel.findOneAndUpdate(
{ _id: req.params.id }, // 查询条件
{ task: req.body.task.task }, // 更新的数据
{ new: true }, // 返回更新后的文档
function(err, doc) {
if (!err) {
res.redirect('/tasks');
} else {
console.error(err);
res.status(500).send('Error updating the document');
}
}
);
});
app.delete('/tasks/:id', function(req, res) {
TaskModel.findById(req.params.id, function(err, doc) {
if (!doc) return res.status(404).send('Document not found');
doc.remove(function() {
res.redirect('/tasks');
});
});
});
关键点解释
- 使用
findOneAndUpdate
:这个方法可以同时进行查找和更新操作,简化了代码逻辑。 - 传递更新数据:直接将需要更新的数据作为第二个参数传递给
findOneAndUpdate
方法。 - 返回更新后的文档:通过设置
{ new: true }
选项,可以获取并返回更新后的文档。
通过这些更改,你应该能够成功更新Mongoose模型中的记录。如果仍然遇到问题,请检查MongoDB连接状态和错误日志以进一步诊断。
根据你的描述和代码片段,问题出在app.put
路由处理函数中。具体来说,在更新记录时,TaskModel.update
方法没有正确地使用。以下是修正后的代码:
修改后的代码示例
app.put('/tasks/:id', function(req, res) {
var taskId = req.params.id;
var updatedTask = req.body.task;
TaskModel.findByIdAndUpdate(taskId, { task: updatedTask }, { new: true }, function(err, updatedDoc) {
if (err) {
console.error("Error updating task:", err);
// 处理错误
return res.status(500).send({ error: 'Failed to update task' });
}
if (!updatedDoc) {
return res.status(404).send({ error: 'Task not found' });
}
res.send(updatedDoc);
});
});
解释
-
findByIdAndUpdate:使用
findByIdAndUpdate
替代update
方法可以更简单地更新文档,并且可以自动找到指定ID的文档。{ new: true }
参数确保返回更新后的文档,而不是原始文档。 -
错误处理:在回调函数中添加了错误处理逻辑,如果出现错误会发送500状态码和错误信息。如果找不到文档,则返回404状态码和相应的错误信息。
-
正确处理请求体:确保从
req.body.task
中获取更新的数据,并将其作为更新的一部分传递给findByIdAndUpdate
方法。
通过这些修改,你的PUT请求应该能够正常工作,并且更新任务记录。