NestJS使用TypeORM按日期过滤实体时返回空数组问题
TypeORM findAndCount查询count匹配但结果集为空问题
问题现象
开发按日期筛选事件实体功能时,最初判断异常是前端传入参数错误导致,但即便将查询条件中的日期硬编码为固定值,依然无法查询到对应数据,接口返回内容如下:
count: 1 // 符合where条件的记录统计总数为1 result: []
对应服务层实现代码:
async findAllByDate( min: string | undefined, max: string | undefined, skip: number, ) { const [result, total] = await this.repository.findAndCount({ take: 10, skip: skip, where: { date: MoreThanOrEqual('2022-06-20'), }, }); console.log(result); return { data: result, count: total, }; }
调用repository.findAndCount方法执行分页查询时,返回的匹配记录总计数为1,但实际查询得到的结果集为空数组,未返回预期的匹配实体数据。
根因分析
问题由传入的分页参数skip异常导致:findAndCount方法的计数和结果查询逻辑相互独立:
- 返回的总计数
total仅根据where条件统计全量匹配的记录数,不受skip、take分页参数影响 - 返回的结果集
result会严格执行分页规则:先跳过skip条匹配记录,再取最多take条记录返回
当前场景下符合日期筛选条件的总记录数仅为1条,只要传入的skip参数值≥1,跳过1条记录后就没有剩余数据可返回,就会出现count为1但结果集为空的现象。你修改硬编码的只有where条件中的日期值,没有修正传入的skip参数,因此问题没有解决。
修复方案
- 先打印接口实际接收到的
skip参数值,异常场景下该值大概率为1或更大的非法值,正常查询第一页数据时skip必须传入0 - 增加参数校验兜底逻辑:如果传入的
skip小于0,直接重置为0;查询拿到total后如果判断skip >= total,可返回分页参数越界提示,或重置skip为0返回第一页数据 - 额外优化建议:日期字段查询不要直接传字符串,建议转成标准
Date对象传入,避免数据库侧隐式类型转换引发的隐形匹配问题。
内容的提问来源于stack exchange,提问作者einMann
相关产品推荐
相关产品推荐

