Skip参数报错:默认返回负值触发MongoServerError求助
解决MongoServerError: Skip value must be non-negative错误
错误信息
MongoServerError: Skip value must be non-negative, but received: -9223372036854775808
问题根源
你的listBySearch控制器方法中,skip参数未设置默认值:
let skip = parseInt(req.body.skip);
当请求未携带skip参数时,req.body.skip为undefined,parseInt(undefined)返回NaN。MongoDB处理skip(NaN)时会将其解析为-9223372036854775808,触发非负校验错误。
修复方案
给skip设置默认值为0,同时增加校验确保其为非负数:
修改后的完整代码
exports.listBySearch = (req, res) => { let order = req.body.order ? req.body.order : "desc"; let sortBy = req.body.sortBy ? req.body.sortBy : "_id"; let limit = req.body.limit ? parseInt(req.body.limit) : 100; // 修复skip参数:设置默认值0,同时确保非负 let skip = parseInt(req.body.skip) || 0; skip = skip < 0 ? 0 : skip; let findArgs = {}; for (let key in req.body.filters) { if (req.body.filters[key].length > 0) { if (key === "price") { findArgs[key] = { $gte: req.body.filters[key][0], $lte: req.body.filters[key][1] }; } else { findArgs[key] = req.body.filters[key]; } } } Product.find(findArgs) .select("-photo") .populate("category") .sort([[sortBy, order]]) .skip(skip) .limit(limit) .exec((err, data) => { if (err) { console.log(err); return res.status(400).json({ error: "Products not found" }); } res.json({ size: data.length, data }); }); };
关键修改说明
parseInt(req.body.skip) || 0:当req.body.skip不存在或解析后为NaN时,默认使用0skip = skip < 0 ? 0 : skip:额外校验,防止客户端传入负数skip值导致相同错误
修改后,无论请求是否携带skip参数、或传入非法值,都能保证skip为非负整数,符合MongoDB的要求。
内容的提问来源于stack exchange,提问作者hacksrinja
相关产品推荐
相关产品推荐

