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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:57:22