Express插入数据库行报错:无法读取undefined的fullName属性
问题原因
报错TypeError: Cannot read properties of undefined (reading 'fullName')是因为req.body为undefined,你在尝试访问不存在的对象的属性。
解决步骤
- 第一步:配置express请求体解析中间件
在express项目的入口文件(通常为app.js或index.js)中,路由注册代码之前添加以下配置,用来解析post请求的请求体:
// 解析JSON格式的请求参数 app.use(express.json()) // 解析表单提交的urlencoded格式请求参数 app.use(express.urlencoded({ extended: true }))
注:以上中间件为express 4.16.0及以上版本内置功能,如果你使用的express版本更低,可以升级express版本,或者单独安装
body-parser包引入使用。
- 第二步:修复现有路由代码的问题
你当前的代码存在SQL注入高危风险、异步逻辑顺序错误、SQL字符串换行语法错误三个问题,修改后的路由代码如下:
var express = require("express"); var router = express.Router(); var db = require("../database"); router.get("/form", function (req, res, next) { res.render("users"); }); router.post("/create", function (req, res, next) { const data = req.body; // 使用?作为占位符,避免SQL注入,也不用手动处理字符串拼接和换行 const sql = "INSERT INTO users (`fullName`, `emailAddress`, `city`,`country`) VALUES (?, ?, ?, ?)"; // 按占位符顺序传入参数数组 db.query(sql, [data.fullName, data.emailAddress, data.city, data.country], function (err, result) { if (err) throw err; console.log("用户数据插入成功"); // 跳转逻辑放到数据库操作回调中,保证插入完成后再跳转 res.redirect("/users/form"); }); }); module.exports = router;
- 第三步:可选校验
如果修改后仍然报错,可以在post路由开头添加console.log(req.body),确认请求体是否正常解析,同时检查前端提交的表单字段名是否和代码中读取的字段名完全一致,无拼写错误。
内容的提问来源于stack exchange,提问作者Deekshitha M
相关产品推荐
相关产品推荐

