Node.js应用中req.body为undefined的原因及解决方法
问题分析与解决
核心原因
你的代码存在两个关键问题:
- 中间件挂载顺序错误:
express.json()(或body-parser.json())必须在路由定义之前挂载,否则路由无法解析JSON请求体。 - 变量取值错误:服务器端错误地从
req.id取值,正确的来源应该是req.body.id。
解决步骤
1. 调整中间件挂载顺序
检查Express应用初始化代码,确保JSON解析中间件在所有路由之前被加载。示例:
const express = require('express'); const app = express(); // 先挂载JSON解析中间件 app.use(express.json()); // 再定义路由 app.post('/registrar_presenca', function (req, res) { // 路由逻辑 }); app.listen(3000, () => console.log('Servidor rodando na porta 3000'));
注:如果之前使用
body-parser,app.use(bodyParser.json())和express.json()功能一致,二选一即可,无需重复配置。
2. 修正服务器端取值逻辑
将服务器端的const id = req.id改为const id = req.body.id,正确获取客户端发送的ID:
app.post('/registrar_presenca', function (req, res) { const id = req.body.id; // 修正取值来源 console.log('Chamada aberta:', chamadaAberta); console.log('Request body:', req.body.id); console.log('ID inserido:', id); if (chamadaAberta) { if (database.hasOwnProperty(id)) { console.log('Aluno registrado: ' + id); res.json({ status: 'OK' }); } else { res.status(400).json({ error: 'ID não encontrado' }); } } else { res.status(400).json({ error: 'Chamada fechada' }); } });
额外验证项
- 在客户端添加日志,确认
idInput.value有有效值:const id = idInput.value; console.log('ID enviado:', id); // 验证输入值是否为空 fetch('http://localhost:3000/registrar_presenca', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: id }) }) - 若存在跨域场景(客户端与服务器端口不同),需安装并配置
cors中间件,避免请求被拦截导致请求体无法到达服务器:const cors = require('cors'); app.use(cors()); // 在中间件挂载阶段添加
内容的提问来源于stack exchange,提问作者John McRow
相关产品推荐
相关产品推荐

