ExpressJS操作MySQL:POST插入接口值异常及语法错误问题
我看到你遇到的问题了——POST接口虽然能成功插入数据,但除了created_at之外的所有字段都变成了?,去掉引号又触发SQL语法错误。这其实是两个小问题叠加导致的,咱们一步步解决:
问题根源拆解
SQL占位符用法错误
mysql模块的?占位符不需要手动加引号,模块会自动根据数据类型处理引号和转义。你给?加上引号后,它就不再是占位符,而是被当成普通字符串?插入到数据库中。那直接去掉引号为什么报错?因为你传入的
postData是一个对象,但connection.query()使用?占位符时,需要传入数组形式的参数(或者改用命名占位符写法),对象和?不匹配就会触发语法错误。缺少JSON请求体解析中间件
你的Express应用没有配置express.json()中间件,这会导致req.body无法获取到Postman发送的JSON数据——这也是数据无法正确映射到字段的潜在原因。
修正后的完整代码
const express = require('express'); const router = express.Router(); const app = express(); const port = process.env.PORT || 5000; // 关键:添加JSON解析中间件,才能读取POST请求的JSON体 app.use(express.json()); var mysql = require('mysql') var connection = mysql.createConnection({ host: 'localhost', user: 'andri', password: '12345', database: 'andri' }); app.listen(port, () => console.log(`Listening on port ${port}`)); app.get('/employees', function (req, res) { connection.query('select * from users', function (error, results, fields) { if (error) throw error; res.end(JSON.stringify(results)); }); }); app.get('/employees/:id', function (req, res) { connection.query('select * from users where id=?', [req.params.id], function (error, results, fields) { if (error) throw error; res.end(JSON.stringify(results)); }); }); app.post('/employees', function (req, res) { // 方法1:数组占位符(推荐,严格对应SQL字段顺序) const { userid, fullname, usergroup, emailid, mobile, title } = req.body; const insertSql = `INSERT INTO users (userid, fullname, usergroup, emailid, mobile, title, created_at) VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`; connection.query(insertSql, [userid, fullname, usergroup, emailid, mobile, title], function (error, results, fields) { if (error) throw error; res.end(JSON.stringify(results)); }); // 方法2:命名占位符(更直观,无需对应顺序,需确保字段名与数据库列名一致) // const insertSql = `INSERT INTO users // (userid, fullname, usergroup, emailid, mobile, title, created_at) // VALUES (:userid, :fullname, :usergroup, :emailid, :mobile, :title, CURRENT_TIMESTAMP)`; // connection.query(insertSql, req.body, function (error, results, fields) { // if (error) throw error; // res.end(JSON.stringify(results)); // }); });
关键修改说明
- 添加
app.use(express.json()):这是Express解析JSON请求体的必备中间件,没有它req.body会是undefined,根本拿不到你发送的参数。 - 占位符的正确使用:
- 数组方式:SQL中的
?顺序必须和后面数组的元素顺序完全匹配,适合字段数量少的场景。 - 命名占位符:用
:字段名替代?,直接传入req.body对象,更直观且不易出错(注意要保证req.body的字段名和数据库列名完全一致)。
- 数组方式:SQL中的
- 移除冗余的
id字段:你的id是自增列(SQL中写了NULL),不需要在INSERT语句中指定,数据库会自动生成。
修改完成后,再用Postman发送POST请求,数据就能正确插入到数据库中了。
内容的提问来源于stack exchange,提问作者Eko Andri
相关产品推荐
相关产品推荐

