如何通过变量名获取单选框提交值?Node.js表单开发求助
问题分析与解决方案
当前代码存在两个核心问题:
- 所有题目单选框共用同一个
name="option",提交后仅能获取最后一道题的选中选项,无法区分各题答案 - 后端异步查询的闭包问题与响应提前终止,导致判分逻辑无法完整执行
前端代码修改(EJS模板)
将单选框的name设置为与题目ID绑定的动态值,同时修正表单元素的语法问题:
<form method="post" action="/marks"> <% if(tls_question.length > 0){ %> <% tls_question.forEach(function(data){ %> <div class="b"> <br> <!-- 修改隐藏域name为数组格式,确保能获取所有题目ID --> <input type="hidden" name="question_ids[]" value="<%= data.QUESTION_ID %>"> <!-- 修正无效的type="text"标签,改为普通文本展示题目编号 --> <%= data.CHAPTER_ID %><%= data.QUESTION_ID %> <div class="b"> <!-- 单选框name绑定题目ID,格式为option_题目ID --> <input type="radio" id="option1_<%= data.QUESTION_ID %>" value="1" name="option_<%= data.QUESTION_ID %>" /> <label for="option1_<%= data.QUESTION_ID %>"><%= data.OPTION_1 %></label><br> <input type="radio" id="option2_<%= data.QUESTION_ID %>" value="2" name="option_<%= data.QUESTION_ID %>" /> <label for="option2_<%= data.QUESTION_ID %>"><%= data.OPTION_2 %></label><br> <input type="radio" id="option3_<%= data.QUESTION_ID %>" value="3" name="option_<%= data.QUESTION_ID %>" /> <label for="option3_<%= data.QUESTION_ID %>"><%= data.OPTION_3 %></label><br> <br> </div> </div> <% }); %> <% } else { %> <p>数据库中无题目数据</p> <% } %> <input type="submit" value="提交"> </form>
修改说明:
- 单选框
name改为option_<%= data.QUESTION_ID %>,每个题目拥有独立的单选组,提交后能通过题目ID定位对应答案 - 隐藏域
name改为question_ids[],确保后端能接收所有题目ID的数组 - 修正了单选框未闭合的语法错误,同时给每个选项的
id添加题目ID后缀,保证与label的for属性正确关联
后端代码修改(Express路由)
使用async/await处理异步数据库查询,避免闭包问题,同时正确获取每个题目的答案:
router.post("/marks", async function(request, response, next){ const questionIds = request.body.question_ids; let score = 0; if(!questionIds || questionIds.length === 0){ return response.send("未选择任何题目答案"); } try { // 遍历所有题目ID,逐一验证答案 for(const questionId of questionIds){ const userAnswer = request.body[`option_${questionId}`]; // 跳过未作答的题目 if(!userAnswer) continue; // 用Promise封装查询,支持await const queryResult = await new Promise((resolve, reject) => { con.query( 'SELECT ANSWER FROM tls_question.ftt_question WHERE QUESTION_ID = ?;', [questionId], (error, data) => { if(error) reject(error); resolve(data); } ); }); if(queryResult.length > 0 && queryResult[0].ANSWER === userAnswer){ score++; console.log(`题目${questionId}回答正确`); } else { console.log(`题目${questionId}回答错误`); } } // 所有题目验证完成后,返回得分结果 response.send(`您的得分是:${score}/${questionIds.length}`); } catch(error) { console.error("判分过程出错:", error); response.status(500).send("服务器内部错误"); } });
修改说明:
- 通过
request.body[option_${questionId}]动态获取对应题目的用户答案 - 用
Promise封装数据库查询,配合async/await解决异步循环的闭包问题 - 统一在所有查询完成后返回响应,避免提前终止请求
- 新增得分统计逻辑,最终返回用户的总得分
内容的提问来源于stack exchange,提问作者Firaga
相关产品推荐
相关产品推荐

