Node.js 如何处理 POST 请求数据

原生 http 模块处理 POST 需监听 req 的 data/end 事件拼接请求体;Express 直接用 express.json() 和 express.urlencoded() 中间件解析,req.body 直接拿数据。注意校验数据与限制请求体大小。

最佳实践
Node.js 事件循环与异步任务示意

两种方式:原生 http 模块要监听请求对象的 data/end 事件手动拼接请求体;Express 框架用内置的 express.json() / express.urlencoded() 中间件解析后,直接从 req.body 取数据。生产项目基本都用框架方式。

原生 http 方式

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => { body += chunk; });
    req.on('end', () => {
      console.log('收到 POST 数据:', body);   // JSON.parse(body) 解析 JSON
      res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
      res.end('接收成功');
    });
  } else {
    res.writeHead(404).end('Not Found');
  }
});

server.listen(3000);

数据是分块(chunk)到达的流,必须攒到 end 事件再处理。

Express 方式

const express = require('express');
const app = express();

app.use(express.json());                             // 解析 application/json
app.use(express.urlencoded({ extended: true }));     // 解析表单

app.post('/api/user', (req, res) => {
  const { name, email } = req.body;    // 直接取用
  res.json({ received: { name, email } });
});

app.listen(3000);

body-parser 已并入 Express 4.16+,无需单独安装。

生产注意事项

  • 限制体积:express.json({ limit: '1mb' }),防止超大请求体打爆内存;
  • 校验数据:用 zod/joi 等库校验 req.body 结构,永远不要信任客户端输入;
  • 文件上传:express.json 处理不了 multipart,用 multer 或 busboy。

常见问题(FAQ)

Q:req.body 是 undefined?

最常见原因:没挂对应 Content-Type 的中间件,或客户端发送的 Content-Type 与中间件不匹配(比如发 JSON 但只挂了 urlencoded)。

Q:如何调试 POST 接口?

curl -X POST -H "Content-Type: application/json" -d '{"a":1}' http://localhost:3000/api/user,或用 Postman/Apifox。

Q:数据流式和一次性读取怎么选?

小体量 JSON/表单直接中间件一次性解析;大文件或大 payload 才需要流式边收边处理。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台