我正在使用Sequelize和Express / Node。我有一个模型ProjectImages
,它是每个Project
模型的图像的列表。从我的API端点/api/projectsimages
进行GET
查询:
// Express router
router.get('/api/projectsimages/:id', function(req, res, next) {
models.ProjectImages.findAll({
where: {
parentId: req.params.id,
},
}).then((response) => {
return res.send(JSON.stringify(response));
});
});
在前端,我收到此JSON:
{
"Projects": [
{
"id": 1,
"url": "https://picsum.photos/200/300/?random",
"parentId": 1
},
{
"id": 2,
"url": "https://picsum.photos/200/300/?random",
"parentId": 1
},
{
"id": 3,
"url": "https://picsum.photos/200/300/?random",
"parentId": 1
},
]
}
现在在前端,我从数组{ id: 2 }
中删除带有ProjectImages
的行:
ProjectImages = ProjectImages.filter((item) => {
return item.id !== 2;
});
所以现在ProjectImages是:
{
"ProjectImages": [
{
"id": 1,
"url": "https://picsum.photos/200/300/?random",
"parentId": 1
},
{
"id": 3,
"url": "https://picsum.photos/200/300/?random",
"parentId": 1
},
]
}
然后我将其与/api/projectsimages/1
发送回PUT
:
return fetch('/api/data', {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
method: 'PUT',
body: JSON.stringify(ProjectImages),
});
现在,我的问题是:给定我要发送的JSON,如何告诉Express Router删除从前端数组中删除的行?我想我可以在路由器中进行查询,以使用{ parentId: 1 }
检索所有项目,将结果与我发送的JSON进行比较,并删除传入数组中不存在的项目。但这似乎不是很有效。
哪种方法最合适?
// Express router
router.put('/api/projectImages/:id', function(req, res, next) {
// ???
});
答案 0 :(得分:1)
我强烈建议您使用DELETE
删除ProjectImage
,而不是从PUT
请求中隐式删除数据库对象。毕竟,如果前端出现错误并意外发送空数组怎么办?这将导致记录被删除。
如果您愿意冒险或出于任何原因,在客户端执行DELETE
时必须执行PUT
操作,则必须采用您提到的方法-获取数据库记录并将它们与客户端的有效负载进行比较。
router.put('/api/projectImages/:id', async function(req, res, next) {
const imageIds = req.body.map(x => x.id)
// fetch images
const images = await models.ProjectImages.findAll({
where: {
parentId: req.params.id,
}
})
const imagesToDelete = images.filter(x => !imageIds.includes(x.id))
for (image of imagesToDelete) {
await image.destroy()
}
// continue as per usual with your PUT request
});