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
相关产品推荐
相关产品推荐

