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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:18:03