Node.js ->更新一个字段导致丢失其他字段

xa9qqrwz  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(149)

我正在为React项目创建一个后端,在那里我填写一个表单来创建一个页面。

const PAGES = [
  {
    id: "p1",
    name: "Webinar Butique",
    tema: "Boho",
    area: "Hardware Store",
    type: "Basic",
    imageUrl: "https://i.ytimg.com/vi/U72Aoxuv5d8/maxresdefault.jpg",
    creator: "u1",
  },
];

属性为:"name", "type", "area", "tema"
在后端,我创建了一个名为createPage的中间件,以便在router.post("/api/pages", pagesController.createPage)上发出post请求

创建页面

const createPage = (req, res, next) => {
  const { name, tema, type, area, creator } = req.body;
  // instead of doing -> const name = req.body.name for each of them use {}

  const createdPage = {
    id: uuidv4(),
    name,
    tema,
    type,
    area,
    creator,
  };

  PAGES.push(createdPage); // unshift(createdPage)

  res.status(201).json({ page: createdPage }); // 201 - sucessfully created in the server
};

对于按标识更新页面

const updatePageById = (req, res, next) => {
  //const stores the address of the object and not the object it self
  const { name, tema, type, area } = req.body;
  const pageId = req.params.pid;

  const updatedPage = { ...PAGES.find((p) => p.id === pageId) };
  const pageIndex = PAGES.findIndex((p) => p.id === pageId);

  updatedPage.name = name;
  updatedPage.type = type;
  updatedPage.area = area;
  updatedPage.tema = tema;

  // replace the old object at that index with the new updatedPage
  PAGES[pageIndex] = updatedPage

  res.status(201).json({page: updatedPage})
};

我的问题是,假设用户只想更改"name"属性,而保留其他属性不变。
我试过 Postman ,把它打到http://localhost:8080/api/pages/p1

{
    "name": "new butique"
}

但问题是,当我请求gethttp://localhost:8080/api/pages/p1时,它会删除另一个未更新的字段(在本例中为type、area、特马)
我已经在复制现有的数组,正在执行const updatedPage = { ...PAGES.find((p) => p.id === pageId) };操作,但无论如何都会丢失它们。
我可以用什么方式遵循不丢失这些字段时,用户只更新一个字段,而不是所有的要求体?
多谢

zdwk9cvp

zdwk9cvp1#

在您的函数中,您要告诉它更新每个值,即使没有值:

// This part of the function is causing you issues
updatedPage.name = name;
updatedPage.type = type;
updatedPage.area = area;
updatedPage.tema = tema;

因此,贵方要求:

{
    "name": "new butique"
}

将仅具有name的值,并将其余属性设置为undefined。当您覆盖PAGES中的上一项时,它将具有新属性,但也具有值为undefined的所有属性
在将属性设置为新值之前,请检查该属性是否存在于传入的请求中,如果不存在,则不要更新它。

const updatePageById = (req, res, next) => {
  //const stores the address of the object and not the object it self
  const { name, tema, type, area } = req.body;
  const pageId = req.params.pid;

  const updatedPage = { ...PAGES.find((p) => p.id === pageId) };
  const pageIndex = PAGES.findIndex((p) => p.id === pageId);
  
  // only update if the property exists on the request
  if (name) updatedPage.name = name;
  if (type) updatedPage.type = type;
  if (area) updatedPage.area = area;
  if (tema) updatedPage.tema = tema;

  // replace the old object at that index with the new updatedPage
  PAGES[pageIndex] = updatedPage

  res.status(201).json({page: updatedPage})
};

否则,您可以为PATCH请求设置一个新的路由。如果没有:不要更改它。

相关问题