Обновление Sequelize, возвращающееся до и после результатов - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать маршрут API обновления с помощью Sequelize, который будет:

  1. Захватить запись перед обновлением (beforeRec)
  2. Выполнить обновление
  3. Захват обновленной записи (updatedRec)
  4. Возврат как beforeRec, так и updatedRec

У меня проблемы с цепочкой обещаний, которая выполняет запросы выбора до и после перед выполнениемобновление.Я пробовал несколько разных способов объединения и захвата результатов, но вот последний код:

router.put('/:id', (req, res) => {
  const pk = req.params.id;

  const getBeforeRec = Master.findByPk(pk)
    .then(rec => {return rec})

  const updateRec = getBeforeRec
    .then(
      Master.update(
        req.body,
        { where: {id: pk} }
      )  
    )

  const getUpdatedRec = updateRec
    .then(
      Master.findByPk(pk)
        .then(rec => {return rec})
    );

  return Promise.all([getBeforeRec, updateRec, getUpdatedRec])
    .then( ([beforeRec, updateRes, afterRec]) => {
      return res.json({beforeRec, afterRec})
    })
    .catch(err => {
      return res.status(400).json({'error': err});
    });
});

Вот обработанный пример того, как результаты выглядят:

{
    "beforeRec": {
        "id": 100,
        "updated_col_name": false,
    },
    "afterRec": {
        "id": 100,
        "updated_col_name": false,
    }
}

В консоли, Я вижу, что обновление выполняется последним:

Executing (default): SELECT [id], [updated_col_name] FROM [master] WHERE [master].[id] = N'100';
Executing (default): SELECT [id], [updated_col_name] FROM [master] WHERE [master].[id] = N'100';
Executing (default): UPDATE [master] SET [updated_col_name]=1 WHERE [id] = N'106'

Каков наилучший способ заставить второе предложение select ждать обновления?

Любая помощь в разъяснении, как связывать обещания, покаЗахватив результаты по пути будут с благодарностью!Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

После нескольких попыток, он, наконец, работает со вложением:

router.put('/:id', (req, res) => {
  const pk = req.params.id;
  let beforeRec;

  Master.findByPk(pk)
    .then(rec => { beforeRec = rec; })
    .then(() => {
      Master.update(
        req.body,
        { where: {id: pk} }
      )
      .then(() => {
        Master.findByPk(pk)
          .then(rec => { return rec; })
          .then((afterRec) => {
            return res.json({beforeRec, afterRec})
          })
      })
    })  
    .catch(err => {
      return res.status(400).json({'error': err});
    });
});

Если я не вложил второй Master.findByPk, то Master.update () завершится последним.Кроме того, хотя я могу установить beforeRec вне цепочки обещаний, для afterRec это не сработало.

Мне это не нравится, поскольку я все еще смущен обещаниями, но он возвращает желаемые результаты.Тем не менее, с этим вложенным беспорядком, я не уверен, где принадлежит catch ().Будет ли он ловить ошибки внутри вложенных then ()Только дальнейшее тестирование покажет.

0 голосов
/ 12 декабря 2018

Это можно сделать с помощью previous метода экземпляра, который был возвращен запросом на обновление:

Master.update( req.body , { where: {id: pk} }).then(master => {
    console.log(master.get());          // <---- Will give you latest values
    console.log(master.previous());     // <---- returns the previous values for all values which have changed
})  

Подробнее:

http://docs.sequelizejs.com/class/lib/model.js~Model.html#instance-method-previous

https://github.com/sequelize/sequelize/issues/1814

0 голосов
/ 12 декабря 2018

Дайте этому шанс:

router.put('/:id', (req, res) => {
  const pk = req.params.id;
  let beforeRec, afterRec;

  Master.findByPk(pk)
    .then(rec => { beforeRec = rec; })
    .then(() => {
      Master.update(
        req.body,
        { where: {id: pk} }
      )
    })
    .then(() => {
      Master.findByPk(pk)
        .then(rec => { afterRec = rec; })
    })
    .then(() => {
      res.json({beforeRec, afterRec})
    })
    .catch(errror => {
      res.status(400).json({error});
    });
});
...