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
Как я могу точно знать, что запись была обновлена или нет.
Ответы
Ответ 1
Вот что я думаю, что вы ищете.
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
- это просто вернуть сам объект, а не другие грязные метаданные, которые могут оказаться бесполезными.
Ответ 2
Функция обновления 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);
});
Ответ 3
То же самое вы можете сделать с 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)
}
}
Ответ 4
Вы можете просто найти элемент и обновить его свойства, а затем сохранить его. 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
Ответ 5
Простой фрагмент для обновления и получения обновленного результата
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()
})