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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:16:01