Node.js 如何处理 POST 请求数据
原生 http 模块处理 POST 需监听 req 的 data/end 事件拼接请求体;Express 直接用 express.json() 和 express.urlencoded() 中间件解析,req.body 直接拿数据。注意校验数据与限制请求体大小。
两种方式:原生 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 才需要流式边收边处理。