如何在AdonisJS中验证Schema日期并解决MySQL存储失败问题
问题分析与解决方案
核心问题
你的验证器将tahun_terbit解析为JavaScript Date对象,但直接传入Book.create()时,ORM可能无法自动将其转换为MySQL兼容的DATE格式字符串,导致存储失败。
解决方案步骤
1. 确认数据库字段类型
先检查MySQL中books表的tahun_terbit字段类型,确保是DATE而非DATETIME/TIMESTAMP。如果是DATE类型,只接受YYYY-MM-DD格式的字符串。
2. 手动转换Date对象为MySQL兼容格式
修改控制器代码,将验证后的Date对象转为YYYY-MM-DD字符串:
const books = await request.validate(BooksValidationValidator); // 提取Date对象的日期部分,转为MySQL支持的格式 books.tahun_terbit = books.tahun_terbit.toISOString().split('T')[0]; await Book.create(books);
3. 模型层自动处理日期转换(推荐,以AdonisJS为例)
如果使用AdonisJS Lucid ORM,可在Book模型中配置字段的日期格式,自动完成转换:
import { DateTime } from 'luxon'; import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'; export default class Book extends BaseModel { // 其他字段定义... @column.date({ format: 'yyyy-MM-dd' }) public tahun_terbit: DateTime; }
配置后,ORM会自动将Date对象/字符串转换为MySQL兼容的格式存储。
4. 修改验证器直接返回字符串格式
若不需要Date对象,可将验证器的schema.date()改为schema.string()+日期规则,直接返回YYYY-MM-DD字符串:
tahun_terbit: schema.string({}, [ rules.date({ format: 'yyyy-MM-dd' }) ]),
内容的提问来源于stack exchange,提问作者Badrudin
相关产品推荐
相关产品推荐

