我正在为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) };
操作,但无论如何都会丢失它们。
我可以用什么方式遵循不丢失这些字段时,用户只更新一个字段,而不是所有的要求体?
多谢
1条答案
按热度按时间zdwk9cvp1#
在您的函数中,您要告诉它更新每个值,即使没有值:
因此,贵方要求:
将仅具有
name
的值,并将其余属性设置为undefined
。当您覆盖PAGES
中的上一项时,它将具有新属性,但也具有值为undefined的所有属性在将属性设置为新值之前,请检查该属性是否存在于传入的请求中,如果不存在,则不要更新它。
否则,您可以为
PATCH
请求设置一个新的路由。如果没有:不要更改它。