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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:09:49