Sequelize - обновить запись и вернуть результат

Я использую sequelize с MySQL. Например, если я:

models.People.update({OwnerId: peopleInfo.newuser},
        {where: {id: peopleInfo.scenario.id}})
        .then(function (result) {
            response(result).code(200);

        }).catch(function (err) {
        request.server.log(['error'], err.stack);
       ).code(200);
    });

Я не получаю информацию обратно, если модель людей была успешно обновлена ​​или нет. Результат переменной - это просто массив с одним элементом, 0 = 1

Как я могу точно знать, что запись была обновлена ​​или нет.

4b9b3361

Вот что я думаю, что вы ищете.

db.connections.update({
  user: data.username,
  chatroomID: data.chatroomID
}, {
  where: { socketID: socket.id },
  returning: true,
  plain: true
})
.then(function (result) {
  console.log(result);   
  // result = [x] or [x, y]
  // [x] if you're not using Postgres
  // [x, y] if you are using Postgres
});

Из документов Sequelize: обещание возвращает массив с одним или двумя элементами. Первый элемент x - это всегда количество затронутых строк, а второй элемент y - это фактические затронутые строки (поддерживается только в postgres с параметром options.returning true).

Предполагая, что вы используете Postgres, вы можете получить доступ к обновленному объекту с result[1].dataValues.

Вы должны установить параметр returning returning: true чтобы Sequelize возвращал объект. И plain: true - это просто вернуть сам объект, а не другие грязные метаданные, которые могут оказаться бесполезными.

58
11 нояб. '16 в 10:51
источник

Функция обновления secelize возвращает несколько затронутых строк (первый параметр массива результатов).

Вы должны вызвать find, чтобы получить обновленную строку

models.People.update({OwnerId: peopleInfo.newuser},
    {where: {id: peopleInfo.scenario.id}})
    .then(function (result) {
      models.People.findById(peopleInfo.scenario.id)
      .then(function(user){
        response(user).code(200);
      }).catch(function (err) {
         request.server.log(['error'], err.stack);
       ).code(200);
      });
    }).catch(function (err) {
    request.server.log(['error'], err.stack);
   ).code(200);
});
7
25 июля '16 в 14:19
источник

То же самое вы можете сделать с async-await, особенно во избежание вложенных обещаний. Вам просто нужно создать асинхронную функцию :)

const asyncFunction = async function(req, res) {
    try {
        //update 
        const updatePeople = await models.People.update({OwnerId: peopleInfo.newuser},
                                    {where: {id: peopleInfo.scenario.id}})
        if (!updatePeople) throw ('Error while Updating');
        // fetch updated data
        const returnUpdatedPerson =  await models.People.findById(peopleInfo.scenario.id)
        if(!returnUpdatedPerson) throw ('Error while Fetching Data');
        res(user).code(200);
    } catch (error) {
        res.send(error)
    }
} 
1
23 марта '19 в 22:33
источник

Простой фрагмент для обновления и получения обновленного результата

models.People.findOne({
    where: {id: peopleInfo.scenario.id}
})
.then((people) => {
    if(people == null) console.log("invalid people");
    people.fieldOne = currentValue;
    people.fieldtwo = currentValue;
    return people.save()
})
0
06 мая '19 в 11:05
источник

Вы можете просто найти элемент и обновить его свойства, а затем сохранить его. Save() приводит к запросу ОБНОВИТЬ к БД

        const job = await Job.findOne({where: {id, ownerId: req.user.id}});
        if (!job) {
            throw Error('Job not updated. id: ${id}');
        }

        job.name = input.name;
        job.payload = input.payload;
        await job.save();

На Postgres:

Executing (default): UPDATE "jobs" SET "payload"=$1,"updatedAt"=$2 WHERE "id" = $3
0
03 мая '19 в 5:25
источник