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

Node.js接口报错:无法解构req.body的'name'属性,求协助解决

问题核心:req.body 未定义

你遇到的TypeError: Cannot destructure property 'name' of 'req.body' as it is undefined,本质是Express 默认不会自动解析 JSON 格式的请求体,导致req.body为undefined。

第一步:解决 req.body 未定义问题

在你的 Express 应用初始化代码中,所有路由定义之前添加 JSON 解析中间件:

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

// 必须放在路由之前,用于解析 JSON 请求体
app.use(express.json());

// 后续才是你的 POST 路由
app.post('/db/:userId', async (req, res)=> {
  // ... 你的路由代码
});

添加后,Express 会自动解析Content-Type: application/json的请求体,req.body就能正确获取到 Postman 发送的 JSON 数据。

第二步:修复代码中的其他关键问题

解决 req.body 问题后,你的代码还有几个必须修复的问题,否则会出现报错或安全风险:

1. 消除 SQL 注入风险

直接将变量拼接进 SQL 语句是高危操作,必须改用参数化查询:

// 替换原有的 SQL 拼接和查询逻辑
const updateSql = `UPDATE user_info 
                   SET name = ?, scnmb = ?, login = ?, password = ?, is_logged = ? 
                   WHERE id = ?`;
const params = [name, scnmb, login, password, isLogged, userId];

conn.query(updateSql, params, (err, result) => {
  if (err) {
    console.log(err);
    return res.status(500).send("Error updating user");
  }
  res.json(result);
});

2. 修正数据库连接的异步逻辑

你当前的代码未等待连接建立就执行查询,且提前关闭连接会导致查询中断。正确做法是将查询逻辑放在连接成功的回调中,并在查询完成后关闭连接:

conn.connect(err => {
  if (err) {
    console.log(err);
    return res.status(500).send("Failed to connect to database");
  }
  console.log('DATABASE ----- CONNECTED SUCCESSFULLY');

  // 连接成功后执行查询
  const { name, scnmb, login, password, isLogged } = req.body;
  const updateSql = `UPDATE user_info 
                     SET name = ?, scnmb = ?, login = ?, password = ?, is_logged = ? 
                     WHERE id = ?`;
  const params = [name, scnmb, login, password, isLogged, userId];

  conn.query(updateSql, params, (err, result) => {
    if (err) {
      console.log(err);
      return res.status(500).send("Error updating user");
    }
    res.json(result);
    // 查询完成后再关闭连接
    conn.end(err => {
      if (err) console.log(err);
      else console.log('DATABASE ----- DISCONNECTED SUCCESSFULLY');
    });
  });
});

3. 推荐使用数据库连接池

每次请求创建新连接效率极低,建议改用连接池管理连接(全局仅初始化一次):

// 全局初始化连接池(放在路由外部)
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'testdb',
  password: '',
  connectionLimit: 10 // 可根据业务调整
});

// 路由中使用连接池
app.post('/db/:userId', (req, res)=> {
  const { userId } = req.params;
  const { name, scnmb, login, password, isLogged } = req.body;

  const updateSql = `UPDATE user_info 
                     SET name = ?, scnmb = ?, login = ?, password = ?, is_logged = ? 
                     WHERE id = ?`;
  const params = [name, scnmb, login, password, isLogged, userId];

  pool.query(updateSql, params, (err, result) => {
    if (err) {
      console.log(err);
      return res.status(500).send("Error updating user");
    }
    res.json(result);
  });
});

连接池会自动管理连接的创建与回收,无需手动调用connect和end,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Vuimov Nikita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:55:50