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’); }); }); });


2 回复

在Node.js中使用Mongoose更新数据库记录时遇到错误,可能是由于多种原因引起的。根据你提供的代码,主要问题可能出现在app.put('/tasks/:id', ...)路由处理函数中。让我们逐步分析并修正这个问题。

问题分析

  1. 使用findById后直接更新:在找到文档后,直接修改文档属性然后使用update方法可能会导致问题,因为update方法期望的是一个查询条件对象和一个更新对象。
  2. 删除_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');
        });
    });
});

关键点解释

  1. 使用findOneAndUpdate:这个方法可以同时进行查找和更新操作,简化了代码逻辑。
  2. 传递更新数据:直接将需要更新的数据作为第二个参数传递给findOneAndUpdate方法。
  3. 返回更新后的文档:通过设置{ 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);
    });
});

解释

  1. findByIdAndUpdate:使用findByIdAndUpdate替代update方法可以更简单地更新文档,并且可以自动找到指定ID的文档。{ new: true }参数确保返回更新后的文档,而不是原始文档。

  2. 错误处理:在回调函数中添加了错误处理逻辑,如果出现错误会发送500状态码和错误信息。如果找不到文档,则返回404状态码和相应的错误信息。

  3. 正确处理请求体:确保从req.body.task中获取更新的数据,并将其作为更新的一部分传递给findByIdAndUpdate方法。

通过这些修改,你的PUT请求应该能够正常工作,并且更新任务记录。

回到顶部