Node.js原生环境获取HTTP POST请求JSON及路由404错误解决求助
问题排查及解决方案
你代码现存的核心问题
- 语法结构混乱:代码逻辑块不完整,
http.createServer的回调函数内缺少前置if判断,直接写了else if分支,同时POST路由分支内重复创建了http服务实例,完全没有对当前请求做响应处理,自然会返回404或者无响应。 - 请求体处理逻辑缺失:原生HTTP模块的请求数据是流式传输的,你仅监听了
data事件但没有拼接完整的请求数据,也没有做JSON格式化解析。 - 路由匹配规则不严谨:如果请求URL携带查询参数(例如
/api/authors?test=1)或者末尾带斜杠(/api/authors/),req.url和你写的固定字符串匹配失败,就会触发404。
可行实现思路
- 先补全代码逻辑结构,删除POST分支内冗余的创建服务代码,先对齐现有正常的GET请求处理逻辑
- 预处理请求URL,剔除查询参数和末尾斜杠后再做路由匹配
- 流式拼接POST请求的所有数据块,接收完成后解析为JSON格式
- 添加异常捕获逻辑,处理非法JSON格式的请求
- 请求处理完成后给客户端返回明确的响应头和响应内容
修正后可运行的示例代码
const http = require('http'); const server = http.createServer(async (req, res) => { // 预处理URL:去除查询参数、末尾斜杠,统一路由匹配规则 const path = req.url.split('?')[0].replace(/\/$/, ''); // 先处理你原本正常的GET请求逻辑,可替换成你自己的原有逻辑 if (path === '/api/authors' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: 'GET请求正常响应', data: [] })); return; } // 处理POST请求 else if (path === '/api/authors' && req.method === 'POST') { let body = []; // 拼接流式数据 req.on('data', (chunk) => { body.push(chunk); }); // 数据接收完成后处理 req.on('end', () => { try { // 拼接Buffer并转成JSON const postData = JSON.parse(Buffer.concat(body).toString()); // 这里可以打印拿到的JSON数据,做你自己的业务处理 console.log('收到的POST JSON数据:', postData); // 返回响应 res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: 'POST请求处理成功', receivedData: postData })); } catch (err) { // 处理非法JSON格式的情况 res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: '请求体格式错误,必须是合法JSON' })); } }); return; } // 404逻辑 else { res.writeHead(404, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: 'Route Not Found' })); } }); // 启动服务,监听3000端口 server.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
内容的提问来源于stack exchange,提问作者Ernesto Diaz
相关产品推荐
相关产品推荐

