Почему мое обновление в запросе пут перезаписывает всю запись в Sequelize? - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь сделать функцию "редактирования" для своего проекта, и я застрял в этой части ..

У меня есть запрос пут:

export const updateEvent = (event, id) => (dispatch, getState) => {
  request
    .put(`${baseUrl}/event/${id}`)
    .send(event)
    .then(response => {
      dispatch(updatedEvent(response.body))
    })
    .catch(error => console.log(error))
}

Это это маршрут для указанного пута с Sequelize как ORM:

router.put('/event/:id', async (req, res, next) => {
  const { id } = req.params
  try {
    const event = await Event.findByPk(id)
    const updatedEvent = await event.update(req.body)
    res.send(updatedEvent)
  } catch (error) {
    next(error)
  }
})

Когда я тестирую его с почтальоном, все работает как положено. Я столкнулся с проблемой, когда отправляю положенные данные из React во внешнем интерфейсе.

У меня есть форма, и я сохраняю свои данные в локальном состоянии, а затем отправляю ее в такие действия :

  handleSubmit = e => {
    e.preventDefault()
    const id = this.props.event.id
    const updatedEvent = {
      name: this.state.name,
      description: this.state.description,
      picture: this.state.picture,
      startDate: this.state.startDate,
      endDate: this.state.endDate,
      userId: this.props.userId
    }

    this.props.updateEvent(updatedEvent, id)
  }

Любое значение, оставленное пустым в форме, перезаписывает мои поля ничем (пустая строка). Как мне правильно с этим справиться?

1 Ответ

0 голосов
/ 13 марта 2020

Решение состоит в том, чтобы отфильтровать ваш объект так, чтобы вы удалили все свойства, которые имеют пустые значения и поэтому не будут включены в обновление базы данных.

В вашем router.put():

router.put('/event/:id', async (req, res, next) => {
  const { id } = req.params
  try {
    const event = await Event.findByPk(id);

    // filter req.body to remove empty values
    const { body } = req;
    const filteredBody = Object.keys(body).reduce((resultObj, key) => {
      if(body[key] != ''){
        resultObj[key] = body[key];
      }
      return resultObj;
    }, {});

    const updatedEvent = await event.update(filteredBody);
    res.send(updatedEvent)
  } catch (error) {
    next(error)
  }
})
...