Node.js电商网站API排序返回空数组问题排查
Node.js电商API排序返回空数组问题排查与解决
核心问题分析
你的代码中存在关键拼写错误:在定义排除字段数组excludefield时,将需要排除的sort参数误写为short。这导致queryObj中保留了sort参数,最终被当作查询条件传入Product.find()——而你的产品集合中并没有sort字段,因此数据库返回空数组。
修复步骤
修正排除字段的拼写错误
将excludefield数组中的"short"改为"sort",确保排序参数不会被当作查询条件传递:const excludefield = ["page","sort","limit","fields"];修复调试代码的语法错误(可选)
代码中被注释的console.log(JSON.parse.queryString);存在语法错误,正确写法应为console.log(JSON.parse(queryString));,修正后便于后续调试。验证排序逻辑
当请求localhost:5000/api/product/?sort=category,brand时,代码会将参数转换为"category brand",Mongoose会先按category字段升序排序,再按brand字段升序排序。如果需要降序排序,可在参数中添加负号,例如?sort=-category,-brand。
修复后的完整代码片段
const getAllProduct = asynchandler(async (req, res) => { try { // 过滤产品查询条件 const queryObj = {...req.query}; // 排除不需要作为查询条件的字段 const excludefield = ["page","sort","limit","fields"]; excludefield.forEach((el) => delete queryObj[el]); let queryString = JSON.stringify(queryObj) // 替换MongoDB操作符前缀 queryString = queryString.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `$${match}`) let query = Product.find(JSON.parse(queryString)) // 排序逻辑 if (req.query.sort){ const sortBy = req.query.sort.split(",").join(" "); console.log(sortBy); query = query.sort(sortBy) } else { query = query.sort('-createdAt') console.log("默认按createdAt降序排序") } const product = await query; res.json(product) } catch (error) { throw new Error(error) } })
内容的提问来源于stack exchange,提问作者Ashok Deshiyan
相关产品推荐
相关产品推荐

