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

如何基于ShowActiveOnly条件使用Prisma实现产品过滤查询?

Prisma实现产品活跃状态过滤

需求明确:

  • 当showActiveOnly为true时,仅返回活跃(IsActive=true)的产品
  • 当showActiveOnly为false时,返回所有产品

你当前的代码存在逻辑错误:当showActiveOnly=false时,where条件会被设置为IsActive: false,这只会返回非活跃产品,完全不符合需求。以下是修正后的实现方案:

修正后的代码

export const getAllProducts = async (req: Request, res: Response) => {
  try {
    // 处理分页参数,避免NaN或负数导致的异常
    const page = Math.max(Number(req.query.page) - 1, 0) || 0;
    const perPage = Number(req.query.perPage) || 10;
    // 处理状态过滤参数,默认开启活跃产品过滤
    const showActiveOnly = (req.query.showActiveOnly ?? "true") === "true";

    // 动态构建过滤条件
    const whereCondition = showActiveOnly ? { IsActive: true } : {};

    const products = await _db.serviceProduct.findMany({
      where: whereCondition,
      skip: page * perPage, // 分页偏移量与每页数量保持一致,不要写死固定值
      take: perPage,
    });

    // 注意状态码要在响应体之前设置,否则不会生效
    res.status(200).json({ products, code: 200 });
  } catch (error) {
    HandleError(error, res);
  }
};

关键修正说明

  • 动态过滤条件:当showActiveOnly为false时,传入空对象{}作为where参数,Prisma会忽略过滤规则,返回所有产品;为true时,才添加IsActive: true的过滤条件。
  • 分页逻辑修复:原代码中skip: page * 10写死了每页数量,改为page * perPage后,分页逻辑会和配置的perPage保持一致。
  • 参数处理优化:用??空值合并运算符替代||,避免空字符串等假值导致的参数误判;同时用Math.max确保分页页码不会为负数。
  • 响应顺序修正:res.status(200)必须在json()之前调用,否则状态码无法被正确设置(json()返回的Response对象,后续链式调用的status不会覆盖默认值)。

内容的提问来源于stack exchange,提问作者manoj kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:15:07