Node.js连接MySQL插入日期报Incorrect date value错误咨询
Node.js连接MySQL插入日期值报错问题排查
相关代码
以下是连接MySQL Workbench编写的Node.js API代码:
var express = require('express'); const bodyParser = require('body-parser') var cors = require('cors'); const app = express(); const mysql = require("mysql"); app.use(express.json()); app.use(cors()) app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); const db = mysql.createConnection({ host: "localhost", user: "root", password: "12112002suman", database:"chutiyadb", }); // app.get('/' , (req,res) => { // res.send("connected to database"); // }); db.connect(function(err){ if(err) throw err }); function insertData(Title,Amount,Date){ db.query('INSERT INTO expenseitems (title, amount , date) VALUES ( ? , ? , ?)', [Title, Amount, Date], function (err, result) { if (err) throw err; }); } app.post('/api/insert', function(req,res) { insertData(req.body.title, req.body.amount, req.body.date); }); app.listen(3001, () => { console.log(" running on port 3001"); });
报错信息
通过日历组件接收用户输入的dd-mm-yyyy格式日期(例如08-06-2022),执行数据插入操作时触发如下报错:
"Incorrect date value: '2022-06-11T00:00:00.000Z' for column 'date' at row 1"(即第1行date字段的日期值不合法)
问题原因
- MySQL的
DATE类型字段仅支持YYYY-MM-DD格式的纯日期值,不支持带时间、时区标识的ISO 8601格式字符串(即报错信息中带T、Z后缀的UTC时间字符串) - 前端日历组件默认传出的日期值是JavaScript Date对象序列化后的UTC格式字符串,代码中未做格式转换就直接传入SQL语句执行,触发字段类型校验错误
- 即使前端直接传回
dd-mm-yyyy格式的日期字符串,也不符合MySQL DATE类型的格式要求,同样会触发插入失败
修复方案
- 在后端插入数据前,新增日期格式转换逻辑,将传入的日期值统一转为
YYYY-MM-DD格式后再传入SQL语句,同时处理时区偏移避免日期偏差。修改后的核心代码如下:
// 日期格式转换工具函数,输出MySQL兼容的YYYY-MM-DD格式 function formatToMysqlDate(input) { const date = new Date(input); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } function insertData(Title, Amount, Date, callback) { const mysqlFormattedDate = formatToMysqlDate(Date); db.query( 'INSERT INTO expenseitems (title, amount , date) VALUES ( ? , ? , ?)', [Title, Amount, mysqlFormattedDate], callback ); } // 补充接口响应逻辑,避免前端请求持续挂起 app.post('/api/insert', function(req,res) { insertData(req.body.title, req.body.amount, req.body.date, (err, result) => { if (err) return res.status(500).json({code: 500, msg: '数据插入失败', error: err.message}); res.json({code: 200, msg: '数据插入成功', data: result}); }); });
- 可选优化项:
- 不要将数据库账号密码硬编码在源码中,建议通过环境变量读取配置,降低安全风险
- 为数据库连接添加断线重连逻辑,提升服务稳定性
- 接口入参增加格式校验,提前拦截非法的日期、金额参数,减少数据库层面的报错
内容的提问来源于stack exchange,提问作者shreya suman
相关产品推荐
相关产品推荐

