使用Adminbro/Adminjs对接Sequelize时日期字段保存报错如何解决
AdminJS日期字段保存报错解决方案
根因说明
该报错的核心原因是AdminJS前端提交的日期字符串默认是带T和时区标识的ISO格式(例如2024-05-20T12:34:56.000Z),而SQL Server、严格模式下的MySQL等数据库不识别该格式,导致Sequelize执行写入操作时日期转换失败。
可选解决方案
方案1:AdminJS侧统一配置日期字段处理逻辑
在AdminJS的资源配置中,给所有日期/时间类型字段添加自定义的序列化、反序列化规则:
// 通用日期字段配置,可复用给所有日期字段 const datePropertyOpts = { type: 'datetime', // 数据库取值后转换为AdminJS前端可识别的格式 get: (value) => value ? new Date(value).toISOString() : null, // 提交到数据库前转换为数据库兼容的YYYY-MM-DD HH:mm:ss格式 set: (value) => value ? new Date(value).toISOString().slice(0, 19).replace('T', ' ') : null } // 资源配置中引用 const yourResource = { resource: YourSequelizeModel, options: { properties: { createTime: datePropertyOpts, updateTime: datePropertyOpts, // 其他日期字段按相同规则配置即可 } } }
方案2:Sequelize模型层统一处理日期格式
直接在Sequelize定义模型时给日期字段添加getter、setter,全局适配格式:
const { DataTypes } = require('sequelize') const YourModel = sequelize.define('your_table_name', { createTime: { type: DataTypes.DATE, allowNull: false, get() { const raw = this.getDataValue('createTime') return raw ? new Date(raw).toISOString() : null }, set(value) { if (!value) return const formatted = new Date(value).toISOString().slice(0, 19).replace('T', ' ') this.setDataValue('createTime', formatted) } }, // 其他字段定义 })
方案3:SQL Server数据库额外适配
如果使用的是SQL Server数据库,需要额外调整Sequelize连接配置:
const sequelize = new Sequelize(databaseName, username, password, { host: yourHost, dialect: 'mssql', dialectOptions: { options: { useUTC: false, // 按需调整是否使用UTC时间 dateFormat: 'YYYY-MM-DD HH:mm:ss' } }, timezone: '+08:00' // 替换为你所在的时区偏移 })
内容的提问来源于stack exchange,提问作者lumayara
相关产品推荐
相关产品推荐

