You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过变量名获取单选框提交值?Node.js表单开发求助

问题分析与解决方案

当前代码存在两个核心问题:

  1. 所有题目单选框共用同一个name="option",提交后仅能获取最后一道题的选中选项,无法区分各题答案
  2. 后端异步查询的闭包问题与响应提前终止,导致判分逻辑无法完整执行

前端代码修改(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:15:02