后端与接口
实现支持过滤与排序的 API 查询接口时…
在构建搜索端点、数据表格或动态查询 API 时,用白名单和操作符解析实现灵活的过滤与排序。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
实现支持过滤与排序的 API 查询接口时通用
解决思路
- 定义允许的过滤字段白名单(如 allowedFilters)和允许的排序字段白名单(如 allowedSorts)。
- 使用形如 GET /products?category=electronics&price[gte]=100&price[lte]=500&sort=-price,name 的查询参数语法。
- 遍历 req.query 解析过滤条件:跳过 sort 键;用正则 /^(\w+)\[(\w+)\]$/ 匹配 field[operator] 形式,提取字段与操作符。
- 对带操作符的过滤:若字段不在 allowedFilters 中则跳过,否则写入 filter[field] = { [`$${operator}`]: parseValue(value) }。
- 对不带操作符的过滤:若键在 allowedFilters 中,则直接 filter[key] = value。
- 解析排序:将 req.query.sort 按逗号分割,字段以 - 开头则方向为 -1,否则为 1;去掉前导 - 得到字段名;仅当字段在 allowedSorts 中时写入 sort[name] = direction。
- 用 parseValue 转换值类型:'true' 转 true,'false' 转 false,数字字符串转 Number,其余保持字符串。
- 执行查询:Product.find(filter).sort(sort),并以 { data: products } 形式返回 JSON。
- 支持的操作符:eq(等于,?status=active)、ne(不等于,?status[ne]=deleted)、gt/gte(大于/大于等于,?price[gte]=100)、lt/lte(小于/小于等于,?price[lte]=500)、in(在数组中,?status[in]=active,pending)、like(包含,?name[like]=phone)。
- 安全措施:白名单允许的过滤字段;按字段校验输入类型;为频繁过滤的列建立索引;限制查询复杂度;防止 SQL/NoSQL 注入。
- 最佳实践:支持常用操作符;缓存过滤选项列表;监控查询性能;提供合理的默认值。