#mysql #node.js #orm #sql-update #sequelize.js
#mysql #node.js #orm #sql-обновление #sequelize.js
Вопрос:
У меня есть массив объектов, который выглядит примерно так:
[
{
id: '5b29c08b-597c-460c-a3c7-ac8852b7a5dc',
option_text: 'njnj',
answer: false
},
{
id: '8ff5bda6-9335-495c-9c72-15ef258b899b',
option_text: 'jnjn',
answer: true
}
]
Здесь answer
столбец взаимосвязан, например, если какой-либо из объектов answer
установлен на true
другой, он будет поступать как false
из интерфейса. Итак, я должен обновить всю строку, связанную с указанным идентификатором.
С какой проблемой я сталкиваюсь, так это то, что запрос на обновление не выполняется, но он попадает внутрь then
блока кода вместо выдачи ошибки. Ниже приведен мой код для того же:
// UPDATE Option
exports.updateOption = (req, res, next) => {
try {
console.log(req.body);
db.Option.update(req.body, {
where: { question_id: req.params.id }
}).then(() => {
console.log('A');
return res.status(200).send(errors.UPDATED_SUCESSFULLY);
}).catch(err => {
console.log('B');
return res.status(204).send(errors.INTERNAL_SERVER);
});
} catch(err) {
console.log('C');
return res.status(204).send(errors.INTERNAL_SERVER);
}
};
Пример данных таблицы для того же:
Я имею в виду, что сначала в answer
столбец false
для всех строк, связанных с одним и тем же question_id
, а затем обновить конкретную строку, для которой answer
установлено значение true
. Но это хороший подход или кто-нибудь может предложить мне какое-то лучшее решение?
Ответ №1:
Вы должны выполнять все обновления в одной транзакции (чтобы избежать несоответствий в БД):
sequelize.transaction(async transaction => {
const options = req.body;
for (const option of options) {
await db.Option.update(option, {
where: { question_id: req.params.id },
transaction
});
}
}).then(...