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

ExpressJS操作MySQL:POST插入接口值异常及语法错误问题

我看到你遇到的问题了——POST接口虽然能成功插入数据,但除了created_at之外的所有字段都变成了?,去掉引号又触发SQL语法错误。这其实是两个小问题叠加导致的,咱们一步步解决:

问题根源拆解

  1. SQL占位符用法错误
    mysql模块的?占位符不需要手动加引号,模块会自动根据数据类型处理引号和转义。你给?加上引号后,它就不再是占位符,而是被当成普通字符串?插入到数据库中。

    那直接去掉引号为什么报错?因为你传入的postData是一个对象,但connection.query()使用?占位符时,需要传入数组形式的参数(或者改用命名占位符写法),对象和?不匹配就会触发语法错误。

  2. 缺少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的字段名和数据库列名完全一致)。
  • 移除冗余的id字段:你的id是自增列(SQL中写了NULL),不需要在INSERT语句中指定,数据库会自动生成。

修改完成后,再用Postman发送POST请求,数据就能正确插入到数据库中了。

内容的提问来源于stack exchange,提问作者Eko Andri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:14:56