Node.js原生http服务打印req.body显示undefined,无法获取POST请求体的问题求助
Node.js原生http服务打印req.body显示undefined,无法获取POST请求体的问题求助
兄弟我太懂你这种困惑了!原生Node.js的http模块不会像Express、Koa这些框架那样自动帮你解析POST请求体,req本身是个可读流对象,所以你直接打印req.body肯定是undefined——得自己手动把流里的数据拼起来才行,完全不用额外装库,纯原生就能解决!
问题根源
原生http模块的请求对象(req)不会自动将请求体解析成JSON对象挂到req.body上,因为请求体可能是大文件或者分块传输的,Node.js会通过数据流的方式逐步传递内容,所以我们需要手动监听流的事件来收集完整的请求体。
纯原生无额外库的解决方案
我给你修改了服务器代码,加上了请求体的解析逻辑,还加了错误处理,你直接用就行:
const http = require('http'); const server = http.createServer(function(req, res) { // 只处理POST请求(如果需要支持其他请求方法可以扩展) if (req.method === 'POST') { let requestBody = ''; // 1. 监听`data`事件:每次收到请求体的一个数据块就拼接到变量里 req.on('data', (chunk) => { // 把二进制的chunk转成字符串再拼接 requestBody += chunk.toString(); }); // 2. 监听`end`事件:当所有数据块都传输完成时触发 req.on('end', () => { try { // 把拼接好的字符串解析成JSON对象 const parsedBody = JSON.parse(requestBody); console.log('完整请求体:', parsedBody); console.log('你要的name字段值:', parsedBody.name); // 这里就能拿到"Kyle"了! // ✅ 别忘了给客户端返回响应,不然浏览器请求会一直挂着 res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: true, message: '请求体已接收' })); } catch (err) { // 处理JSON格式错误的情况(比如客户端发的不是合法JSON) console.error('解析请求体失败:', err); res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: false, error: '无效的JSON格式' })); } }); // 3. 监听`error`事件:防止请求流出错导致服务崩溃 req.on('error', (err) => { console.error('接收请求体时发生错误:', err); res.writeHead(500, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ success: false, error: '服务器接收数据失败' })); }); } else { // 处理非POST请求的情况 res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('请发送POST请求哦~'); } }); const PORT = 3000; server.listen(PORT, () => { console.log(`服务器跑起来啦:http://localhost:${PORT}`); });
额外提醒:你的客户端代码可以优化下
你的客户端fetch代码本身没问题,但要注意处理服务器的响应,不然你可能看不到返回的结果:
fetch(document.URL, { method: "POST", body: JSON.stringify({ name: "Kyle" }), headers: { "Content-Type": "application/json" }, }) .then(res => { // 先判断请求是否成功 if (!res.ok) throw new Error(`请求失败,状态码:${res.status}`); // 把响应体转成JSON return res.json(); }) .then(responseData => console.log('服务器返回:', responseData)) .catch(err => console.error('请求出错:', err));
这样修改后,你再测试的话,服务器控制台就能正常打印{ name: 'Kyle' },也能拿到name字段的值啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

