router.post("/update-quiz", upload.single("file"), async (req, res) => {
const transaction = await sequelize.transaction();
try {
const actions = {
"Multiple Choice": async (questions, transaction) => {
const data = await MultipleChoice.bulkCreate(questions, {transaction: transaction});
return data.map(question => question.question_id);
},
"Identification": async (questions, transaction) => {
const data = await Identification.bulkCreate(questions, {transaction: transaction});
return data.map(question => question.question_id);
},
"True or False": async (questions, transaction) => {
const data = await TrueOrFalse.bulkCreate(questions, {transaction: transaction});
return data.map(question => question.question_id);
}
};
const deleteActions = {
"Multiple Choice": async (questions_id, transaction) => {
await MultipleChoice.destroy({
where: {
question_id: {
[Op.or]: questions_id
}
}
}, {transaction: transaction});
},
"Identification": async (questions_id, transaction) => {
await Identification.destroy({
where: {
question_id: {
[Op.or]: questions_id
}
}
}, {transaction: transaction});
},
"True or False": async (questions_id, transaction) => {
await TrueOrFalse.destroy({
where: {
question_id: {
[Op.or]: questions_id
}
}
}, {transaction: transaction});
}
};
const quiz = JSON.parse(req.body.quiz);
const questions = JSON.parse(req.body.questions);
if (Object.keys(actions).includes(quiz.type)) {
const validator = {
"Multiple Choice": validateMultipleChoice,
"Identification": validateIdentification,
"True or False": validateTrueOrFalse
};
const validations = getValidations(questions, quiz, validator[quiz.type]);
if (validations.every(v => v.isValid)) {
const previousQuiz = await Quiz.findOne({where: {quiz_id: quiz.quiz_id}}, {transaction: transaction});
await deleteActions[previousQuiz.type](previousQuiz.questions_id.split("|"), transaction);
const newQuestions = await actions[quiz.type](questions, transaction);
let fileName = "";
if (!req.file) {
fileName = `${quizImagePath}/${createDateForFile()}.png`;
createImage(300, 200, fileName, 30, "quizzy-quest");
} else {
fileName = `${quizImagePath}/${req.file.filename}`;
}
await Quiz.update(
{
name: quiz.name,
description: quiz.description,
topic: quiz.topic,
type: quiz.type,
visibility:quiz.visibility,
questions_id: newQuestions.join("|"),
image_path: fileName
},
{where: {quiz_id: quiz.quiz_id}},
{transaction: transaction}
);
await transaction.commit();
return res.status(201).json({message: "Quiz successfully updated."});
} else {
return res.status(400).json(validations.filter(v => !v.isValid).map(v => v.message));
}
} else {
return res.status(400).json(["Invalid quiz type"]);
}
} catch (error) {
await transaction.rollback();
return res.status(500).json({error: error.toString()});
}
});
路线是关于更新测验(续集模型)然后删除以前的问题 (续集模型)并添加编辑/更新的问题。我添加事务以确保数据完整性。我调试了 SQLITE_BUSY 错误的来源,它位于
Quiz.update
中。请向我解释一下这里发生了什么,为什么我会收到该错误,我该如何处理这个问题。任何帮助将不胜感激。
await Quiz.update(
{
name: quiz.name,
description: quiz.description,
topic: quiz.topic,
type: quiz.type,
visibility: quiz.visibility,
questions_id: newQuestions.join("|"),
image_path: fileName
},
{
where: {quiz_id: quiz.quiz_id},
transaction: transaction
},
);
我找到了解决方案。交易密钥应该在选项对象中。