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

Node.js按分类ID筛选职位API失效问题求助

问题分析

  1. 数组匹配逻辑错误:未传入cat参数时,你用jobType: ids(数组)匹配单个ObjectId类型的jobType字段,MongoDB会尝试寻找jobType值等于整个数组的文档,这完全不符合预期,应该用$in操作符匹配数组内的任意ID。
  2. 类型不匹配:前端传入的cat是字符串类型,但jobType字段存储的是ObjectId,直接用字符串匹配会失败,需要转换类型。
  3. 空值判断漏洞:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:20