Последовательность удаления строк, отсутствующих в JSON - PullRequest
0 голосов
/ 04 октября 2018

Я работаю с 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 голосов
/ 04 октября 2018

Я настоятельно рекомендую использовать 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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...