Prisma查询中通过日期输入参数过滤数据的问题
问题解决:传入日期参数无法正确筛选Prisma数据
问题原因
JSON本身不支持原生Date类型,通过tRPC传递日期参数时,前端的Date对象会被序列化为ISO格式的字符串。虽然Zod的z.date()类型标注为Date,但实际接收的参数可能是字符串,导致Prisma无法正确识别并执行日期筛选逻辑。
解决方案
方案1:用Zod强制转换日期类型
将z.date()替换为z.coerce.date(),它会自动把传入的ISO字符串(或其他可解析的日期格式)转换为原生Date对象,无需手动处理:
appReqscreated24H: protectedProcedure .input( z.object({ startDate: z.coerce.date() // 替换为coerce.date() }) ) .query(async ({ ctx, input }) => { return await ctx.prisma.appRequest.count({ where: { created_at: { gte: input.startDate }, NOT: { status: { in: [RequestStatus.COMPLETE] } } } }) }),
方案2:手动转换日期参数
如果不想修改Zod验证规则,可以在查询前手动将输入参数转为Date实例:
appReqscreated24H: protectedProcedure .input( z.object({ startDate: z.date() }) ) .query(async ({ ctx, input }) => { // 手动转换为Date对象 const startDate = new Date(input.startDate); return await ctx.prisma.appRequest.count({ where: { created_at: { gte: startDate }, NOT: { status: { in: [RequestStatus.COMPLETE] } } } }) }),
额外排查步骤
可以先在query函数中添加日志,确认传入的startDate实际类型:
.query(async ({ ctx, input }) => { console.log("startDate类型:", typeof input.startDate); console.log("startDate值:", input.startDate); // ... 后续查询代码 })
如果输出类型为string,则说明确实是序列化导致的问题,使用上述方案即可解决。
内容的提问来源于stack exchange,提问作者IndieMamba
相关产品推荐
相关产品推荐

