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

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类型的格式要求,同样会触发插入失败

修复方案

  1. 在后端插入数据前,新增日期格式转换逻辑,将传入的日期值统一转为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});
    });
}); 
  1. 可选优化项:
    • 不要将数据库账号密码硬编码在源码中,建议通过环境变量读取配置,降低安全风险
    • 为数据库连接添加断线重连逻辑,提升服务稳定性
    • 接口入参增加格式校验,提前拦截非法的日期、金额参数,减少数据库层面的报错

内容的提问来源于stack exchange,提问作者shreya suman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:12:59