我正在制作一个反应注册表,其中包含一些字段(idStudent(主键和自动增量),名字,姓氏,......,教师,先决条件),我正在使用 Formik &是的用于验证。
后来,我必须根据先决条件和某些科目获得的成绩将我的应用程序与推荐系统链接(向学生推荐最后一年的项目)。
一开始,我只使用一个表来存储来自前端表单的数据,
学生(名字,姓氏,...,先决条件)
学生可以从包含根据教师的先决条件的反应选择中选择先决条件(例如:如果学生学习计算机科学,反应选择将仅显示计算机科学先决条件,例如反应,角度,机器学习......)。 考虑到一个学生可以有多个先决条件,因此学生表中的先决条件列将包含所选先决条件的多个 id, 先决条件存储在我的数据库中的另一个表中(先决条件(idFaculty,idPreconditions,先决条件)) 我知道我可以使用 JSON 文件将多个 id 存储在一个列中,但是在之前的一些帖子中对 Stackoverflow 进行了一些研究之后,我发现处理 JSON 很困难,特别是如果我想更新一列。 所以我创建了另一个表来存储学生在注册时选择的先决条件
(studentPrecessions(idStd(从学生表中引用 idStudent 的外键),idPrecession(从先决条件表中引用 idPrecessions 的外键))
我面临的问题是如何通过 axios 发送两个帖子的请求,考虑到 考虑到也许我应该使用循环来存储多行,以防学生选择多个先决条件。
这就是我所做的:
我的后端文件
app.post("/registerStudent", (req, res) => { const faculty = req.body.faculty; const firstName = req.body.firstName; const lastName = req.body.lastName; const phone = req.body.phone; const email = req.body.email; const password = req.body.password; db.query( "INSERT INTO students (email, password, firstName, lastName, faculty, phone) VALUES (?,?,?,?,?,?)", [email, password, firstName, lastName, filiere, phone], (err, result) => { if (err) { console.log(err); } else { // store chosen prerequisites //result.insertId is the current idStudent of the student who registering const idStd = result.insertId; const idPrerequisite = req.body.idprerequis; db.query( "INSERT INTO studentPrerequisites (idStd, idPrerequisite) VALUES (?,?)", [idFiliere, idPrerequisite], (err, result) => { if (err) { console.log(err); } else { res.send("Values Inserted"); } } ); } } ); });
我的前端代码
const onSubmit = (values, actions) => { Axios.post("http://localhost:3001/registerStudent", { faculty: values.faculty, firstName: values.firstName, lastName: values.lastName, phone: values.phone, email: values.email, password: values.password, }) .then(() => { //preId is an array that contains the selected prerequisites(id's) from react select //I try to use a for loop to store multiple of prerequisites dynamically in case a //student select multiple prerequisites for (let i = 0; i < preId.length; i++) { idPrerequisites: preId[i], } }) .then(() => { console.log("success!"); }); actions.resetForm(); };
最好通过向您的请求传递先决条件数组来让后端处理多个先决条件。我还会使用 Knex 和 async/await 来避免大量 .then 链接并利用事务。如果事务中发生任何错误,事务将恢复所有查询。 Knex 还通过内置方法使查询数据库变得超级简单,而不用编写原始 SQL。您还应该使用对象解构,而不是执行firstName = req.body.firstName、lastName = req.body.lastName等。您可以在此处了解有关knex以及将数据库连接到它的更多信息:https://knexjs.org/guide/#node-js 另外,为什么你不对你的密码进行哈希处理?这是您至少应该做到的最基本的安全性!