Http PUT 删除未更改的数据

Http PUT deletes data that hasn't been changed

我正在尝试编辑 JSON 班次数据库。我正在使用 React 在 Javascript 中写作。 这是我对 PUT 语法的理解:

const editShift = async (changed, id) => {

  const res = await fetch(`http://localhost:5000/shifts/${id}`, {
    method: 'PUT', 
    headers: {
    'Content-type': 'application/json' 
    },
    body: JSON.stringify(changed)
 })
 const data = await res.json()
 setShifts([...shifts, data])
}

data.json:

{
  "shifts": [
    {
      "title": "test",
      "startDate": "2018-06-25T07:30:00.000Z",
      "endDate": "2018-06-25T08:00:00.000Z",
      "allDay": false,
      "id": 1
    },
    {
      "title": "test2",
      "startDate": "2018-06-28T07:30:00.000Z",
      "endDate": "2018-06-28T08:00:00.000Z",
      "allDay": false,
      "id": 2
    }
  ]
}

结果是新班次将仅保留已更改的字段并删除其余字段。有什么想法吗?

要获得之前的班次,您应该在 setShifts 中使用回调,例如:

setShifts(prevShifts => ([...prevShifts, data]))

PUT 请求应该像那样工作。

PUT 请求应该将数据放入旧记录的位置。 您可能希望使用 PATCH 请求仅在旧记录上修补数据。

搁置一边,这取决于您的 /shifts 端点如何实际处理。

我不得不将整个更新的班次发送到已更改的字段中,其中的字段未更改。我不知道为什么,但它工作得很好。

对于这样的问题,如果您发布前后数据示例会很有帮助

  • 数据库为空
  • 请求 #1,负载等于 X
  • 请求 #2,负载等于 Y

此外,了解您的服务器处理程序正在做什么将有助于确定发生了什么。我感觉发生的事情是这样的

// API handler
(req) => {
  const dbData = getDBData();
  dbData.shifts = req.shifts; // overwrite old with new
}

当你需要的是

(req) => {
  const dbData = getDBData();
  req.shifts.forEach((newShiftData) => {
    const shiftId = newShiftData.id;

    if (dbData[shiftId]) {
      dbData[shiftId] = { ...dbData[shiftId], ...newShiftData }; // merge old with new
    }
  });

  // - check if data changed
  // - update DB
}

PUT 请求 替换 目标 URI 中的所有数据。它们不会自动合并更改。

不清楚您是此 API 的作者还是只是消费者,但如果您正在使用 API,您应该寻找其他 API您只发送编辑(HTTP 方法可能是 POST 或 PATCH),或者您需要发送整个班次列表。

或者,也可能每个班次都有一个特定的端点,因此您可以向班次端点发送 1 个 PUT 请求,只是为了编辑该特定端点。