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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:32:22