Node.js按分类ID筛选职位API失效问题求助
问题分析
- 数组匹配逻辑错误:未传入
cat参数时,你用jobType: ids(数组)匹配单个ObjectId类型的jobType字段,MongoDB会尝试寻找jobType值等于整个数组的文档,这完全不符合预期,应该用$in操作符匹配数组内的任意ID。 - 类型不匹配:前端传入的
cat是字符串类型,但jobType字段存储的是ObjectId,直接用字符串匹配会失败,需要转换类型。 - 空值判断漏洞:如果
req.query.cat未传入(值为undefined),cat !== ''会返回true,导致categ变成undefined,查询条件直接失效。
修复代码及步骤
修改后的jobsController.js
const mongoose = require('mongoose'); const { ObjectId } = mongoose.Types; exports.showJobs = async (req, res, next) => { // 搜索功能 const keyword = req.query.keyword ? { tittle:{ $regex: req.query.keyword, $options: 'i' } } : {} // 分类筛选逻辑 let filter = {}; const cat = req.query.cat; if (cat && cat.trim() !== '') { // 将字符串分类ID转为ObjectId try { filter.jobType = ObjectId(cat); } catch (err) { return res.status(400).json({ success: false, message: '无效的分类ID' }); } } else { // 获取所有分类ID,用$in匹配任意分类的职位 const jobTypeIds = await JobType.find({}, '_id').lean().map(item => item._id); filter.jobType = { $in: jobTypeIds }; } // 分页配置 const pageSize = 5; const page = Number(req.query.pageNumber) || 1; const query = { ...keyword, ...filter }; try { const count = await Job.countDocuments(query); const jobs = await Job.find(query) .skip(pageSize * (page - 1)) .limit(pageSize); res.status(200).json({ success: true, jobs, page, pages: Math.ceil(count / pageSize), count, }) } catch (error) { next(error); } }
额外优化点
- 用
lean()+map替代forEach生成分类ID数组,提升查询性能 - 增加了分类ID的格式校验,避免无效ID导致的服务器错误
- 拆分查询条件为
keyword和filter,代码更清晰
内容的提问来源于stack exchange,提问作者Vivek Napit
相关产品推荐
相关产品推荐

