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
相关产品推荐
相关产品推荐

