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

Node.js HTTP服务器中req.on('data')事件未触发的问题求助

解决Node.js HTTP服务器中req.on('data')事件不触发的问题

你的代码里有两个关键问题导致req.on('data')事件无法触发:

问题1:表单input缺少name属性

HTML表单提交时,只有带有name属性的表单控件才会被打包到请求体里。你的input标签没有设置name,提交后请求体是空的,所以不会触发data事件。

问题2:提前结束了响应

你在绑定完data事件后立刻调用了res.end(),这会直接关闭HTTP响应和请求流。此时请求的数据流还没来得及被处理,data事件自然无法触发。正确的做法是在请求的end事件(表示请求体数据接收完成)中再结束响应。

修复后的代码:

const http = require('http');

const server = http.createServer(onConnect);
server.listen(3000);

const homePage = `
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <form action="/process" method="post">
      <h3>Enter your text here</h3>
      <br />
      <!-- 给input添加name属性 -->
      <input type="text" name="userInput" />
      <!-- 添加提交按钮,方便触发表单提交 -->
      <button type="submit">提交</button>
    </form>
  </body>
</html>
`;

function onConnect(req, res) {
    if (req.url === '/') {
        res.write(homePage);
        res.end(); // 首页无数据流,可直接结束响应
    } else if (req.url === '/process' && req.method === 'POST') {
        let body = '';
        // 监听data事件,拼接请求体数据
        req.on('data', (chunk) => {
            body += chunk;
            console.log('收到数据块:', chunk.toString());
        });
        // 数据接收完成后再处理响应
        req.on('end', () => {
            console.log('完整请求体:', body);
            res.write('<h1>Thank you for your submission</h1>');
            res.end(); // 在这里结束响应
        });
    } else {
        res.write('No page found');
        res.end();
    }
}

额外说明:

  • 给input加上name="userInput",表单提交时会把输入内容以userInput=xxx的格式存入请求体。
  • 添加提交按钮,无需按回车即可触发表单提交,优化操作体验。
  • 将res.end()移至req.on('end')回调内,确保请求体数据完全接收后再结束响应。

内容的提问来源于stack exchange,提问作者Sonet Adhikary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:04:42