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

提交quiz.ejs表单时req.body为空的原因排查

Express表单提交后req.body为空的排查方案

以下是几个常见的排查方向,按优先级检查:

  • 中间件挂载顺序错误
    必须确保express.urlencoded({extended:true})和express.json()中间件在所有路由之前挂载。如果路由先被注册,请求会直接进入路由处理逻辑,中间件还没来得及解析请求体,自然拿不到req.body。
    正确的代码顺序示例:

    const express = require('express');
    const app = express();
    
    // 先挂载解析中间件
    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());
    
    // 再挂载业务路由
    app.post('/submit', (req, res) => {
      console.log(req.body); // 此时应该能拿到数据
      // 其他处理逻辑
    });
    
  • 表单设置了多余的enctype属性
    如果表单添加了enctype="multipart/form-data",express.urlencoded无法解析这种格式的请求体,会导致req.body为空。你的场景是radio输入的普通表单,不需要设置这个属性,默认的application/x-www-form-urlencoded格式就能被中间件正确解析。
    检查你的EJS表单代码,确保没有多余的enctype配置:

    <form action="/submit" method="POST">
      <!-- 示例radio输入 -->
      <div>
        <p>问题1:以下哪个是Express的核心中间件?</p>
        <input type="radio" name="q1" value="express.urlencoded"> express.urlencoded
        <input type="radio" name="q1" value="mongoose"> mongoose
      </div>
      <button type="submit">提交测验</button>
    </form>
    
  • 表单method或路由请求方法不匹配
    若表单的method不是POST,而是GET,请求参数会被拼在URL上,req.body必然为空。同时要确保后端路由用的是app.post('/submit', ...),而不是app.get,两者必须对应。

  • EJS渲染后radio的name属性异常
    在浏览器中打开开发者工具(F12),查看渲染后的HTML源码,确认所有radio的name属性都正确设置且不为空。如果EJS模板中用变量生成name(比如name="<%= question.id %>"),要确保变量存在且有有效值,否则提交时不会携带对应的参数。

内容的提问来源于stack exchange,提问作者Aayush Puri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:29:54