Querymen字段值搜索问题:无法接收completed参数进行任务查询
解决Querymen中布尔查询参数丢失的问题
我之前也碰到过Querymen的这个坑,问题出在你没有为completed字段定义对应的解析规则——Querymen是基于schema来验证和解析查询参数的,任何没在schema里声明的参数都会被自动忽略,这就是为什么你的completed=false在接收端完全找不到的原因。
下面是具体的解决步骤:
1. 定义Querymen的参数Schema
首先你需要创建一个schema,明确声明completed字段的类型为布尔值,同时可以把已有的page和limit也统一配置进去:
const { querymen } = require('querymen'); // 定义任务查询的参数规则 const jobQuerySchema = querymen.schema({ page: { type: Number, default: 1 }, // 分页页码,默认1 limit: { type: Number, default: 10 }, // 每页条数,默认10 completed: { type: Boolean } // 明确指定completed是布尔类型 });
2. 在路由中挂载这个Schema中间件
把刚才定义的schema作为中间件添加到你的API路由上,这样Querymen就会自动解析并验证请求中的查询参数:
// 假设你的路由是这样的(根据实际项目调整) app.get(apiRoot, jobQuerySchema, index);
3. 在接收端正常使用解析后的参数
现在你的index函数里的querymen.query就会包含completed字段了,直接用它来构建数据库查询即可:
export const index = ({ querymen: { query, select, cursor }, user }, res, next) => { // 现在query.completed就能拿到请求中的布尔值了 console.log(query.completed); // 当请求参数是completed=false时,这里会输出false // 示例:用query条件查询任务 Job.find(query) .limit(cursor.limit) .skip(cursor.skip) .select(select) .then(jobs => res.json({ rows: jobs })) .catch(next); };
补充说明
- Querymen的schema不仅能帮你解析参数,还能做类型转换和验证——比如如果用户传的是
completed=1,它会自动转换成true,传completed=0则转换成false,非常方便。 - 你的测试用例本身是没问题的,只要后端配置好schema,
completed: false这个参数就能被正常解析到。
内容的提问来源于stack exchange,提问作者Softey
相关产品推荐
相关产品推荐

