序列化JSON中不存在的删除行

时间:2018-10-04 11:13:25

标签: node.js express sequelize.js

我正在使用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) {
    // ???
});

1 个答案:

答案 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
});