Express向SQL数据库发起POST请求时提示undefined错误如何解决
报错原因
你碰到的TypeError: Cannot read properties of undefined和后续潜在的SQL写入问题,是两处代码遗漏/写法错误导致的:
- 核心报错原因:Express框架默认不会解析请求体里的JSON数据,没有配置对应中间件的情况下
req.body值为undefined,读取它下面的product_name等属性时就会直接抛出类型错误。 - 隐藏问题:就算修复了请求体解析,现有SQL语句的占位符写法、参数传参格式也不符合mysql驱动的要求,会导致写入数据异常、SQL执行失败。
修复方案
1. 配置请求体解析中间件
Express 4.16及以上版本内置了JSON解析能力,不需要额外安装第三方包,在所有路由定义之前加上以下两行配置即可:
// 解析JSON格式请求体 app.use(express.json()) // 解析x-www-form-urlencoded格式请求体 app.use(express.urlencoded({ extended: true }))
如果是4.16以下的旧版本,需要先安装body-parser依赖:
npm install body-parser
再在路由前引入并配置:
const bodyParser = require('body-parser') app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true }))
2. 修正SQL语句与传参逻辑
你原有代码里的两处SQL相关错误:
- 给
?占位符手动加了单引号:mysql驱动会自动对传入参数做转义、包裹引号,手动加引号会导致最终写入的都是字面量?字符串。 - 传入了对象作为参数:普通
?占位符是按顺序匹配数组元素的,直接传对象无法和占位符一一对应。
修正后的完整接口代码:
app.post('/getperipherals', (req, res) => { // 按SQL里的字段顺序组装参数数组 const productParams = [ req.body.product_name, req.body.product_type, req.body.product_brand, req.body.product_description, req.body.product_url ]; // 占位符不要加单引号 const insertSql = `INSERT INTO users (product_name, product_type, product_brand, product_description, product_url, register_date) VALUES (?, ?, ?, ?, ?, NOW())`; db.query(insertSql, productParams, (err, result) => { if(err) { // 不要直接throw err,会导致Node服务进程崩溃,返回结构化错误即可 return res.status(500).send({ code: 500, msg: err.message }) } res.send({ code: 200, data: result }) }) })
验证注意点
Postman发请求时,确认请求头Content-Type值为application/json,和你现在的JSON请求体格式匹配,改完代码重启服务即可正常调用接口写入数据。
内容的提问来源于stack exchange,提问作者Guillaume-G9
相关产品推荐
相关产品推荐

