如何基于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
相关产品推荐
相关产品推荐

