如何通过PUT请求更新JSON对象/数组?

时间:2017-11-29 00:22:26

标签: json node.js crud

在我开始之前,我很抱歉以任何方式描述这个问题 - 这节点的东西对我自己来说有点令人生畏。

我正在尝试通过创建具有CRUD功能的简单ToDo列表应用程序来学习Node。

我已经能够实现应用程序的创建和删除功能,我只是无法弄清楚如何在此对象中更新某个任务“完成”:

  var data = [
  {
    task: 'Go to shop',
    date: 'Friday Nov 24 2017',
    completed: 1
  },
  {
    task: 'Complete this assignment',
    date: 'Sunday Nov 26 2017',
    completed: 0
  },
  {
    task: 'Give up on NodeJS',
    date: 'Tue Nov 28 2017',
    completed: 1
  }
]

这是我打算使用的控制器:

app.put('/tasks/:task', function(req, res){
// can't figure out what to put in here
});

以及此AJAX请求

$('.completed').on('click',  function(){
    var item = $(this).parents('li').find('p');
    var completed = {completed: 1};
    $.ajax({
      type: 'PUT',
      url: '/tasks/' + item,
      data: completed,
      success: function(data){
        location.reload();
      }
    })
  })

我能够在某种程度上让它工作,虽然单击按钮后,该功能只会将所有任务更新为“completed / 1”

2 个答案:

答案 0 :(得分:0)

在您的请求对象req中,您可以访问从网址传递给您的参数。在这种情况下,您需要:task参数,该参数表示data数组中目标对象的索引。然后,您更改该对象的已完成状态。

例如:

app.put('/tasks/:task', function(req, res){
   data[params['task']]['completed'] = req.data.completed;
});

也许更清楚一点:

app.put('/tasks/:task', function(req, res){
   let taskIndex = params['task'];
   let targetTask = data[taskIndex];
   let postedStatus = req.data.completed;

   targetTask.completed = postedStatus;
});

答案 1 :(得分:0)

我建议你为每个任务对象添加id键。通常,id是唯一的,因此当您从一系列数据对象中查询某个对象时,可以使用它。

{
  id: 1,
  task: "Now the task has a unique id",
  completed: 0
}

然后,您可以在API网址上使用ID,而不是使用任务字符串,例如/tasks/:taskId

你PUT路由监听器将如下所示

app.put("/tasks/:taskId", (req, res, next)=>{
  data.forEach(ele=>{
    if (ele.id === req.params.taskId) ele.completed = 1;
  });
  res.json({// if you will feedback your changed data to the source.
    message: "Completed a task!",
    data: data,
  });
});

希望这会帮助你!