Node.js中如何基于URL查询参数实现MongoDB排序
MongoDB 基于URL查询参数排序实现方案
现有代码失效原因
- 从
req.query中获取的sort参数是JSON字符串类型,并非可直接传入Mongoose排序方法的JS对象,直接将整个字符串作为对象属性名构造的排序对象,MongoDB无法识别对应规则。 - 原代码中
object[sort] === 1 ? 'ASC' : 'DESC'仅做了无返回值的相等判断,并未给排序对象写入有效属性,逻辑本身不生效。 - Mongoose的
sort()方法原生支持字段名: 1/-1的配置格式:1代表升序、-1代表降序,不需要额外转换为ASC/DESC字符串。
正确实现代码
先做参数容错、异常捕获,再将解析后的合法排序对象传入查询方法即可:
const getSortedBidList = catchAsync(async (req, res) => { // 分页参数默认值兜底 const limit = Number(req.query.limit) || 20; const page = Number(req.query.page) || 1; const offset = (page - 1) * limit; // 默认排序规则兜底:按_id倒序 let sortOption = { _id: -1 }; const { sort } = req.query; if (sort) { try { // 将JSON格式的字符串参数解析为JS对象 sortOption = JSON.parse(sort); } catch (error) { return res.status(400).json({ code: 400, message: '排序参数格式错误,请传入合法JSON格式的排序规则' }) } } const result = await Bid .find({}) .sort(sortOption) .limit(limit) .skip(offset); // 自行补充响应返回逻辑 res.status(200).json({ code: 200, data: result }) })
生产环境优化建议
- URL传参时建议对JSON部分做URL编码,避免特殊字符导致参数解析异常,示例参数编码后格式为
sort=%7B%22_id%22%3A-1%2C%22enquiry_no%22%3A1%7D - 增加排序字段白名单校验,避免非法字段传入导致查询异常或者注入风险,示例代码:
// 配置允许排序的字段白名单 const ALLOW_SORT_FILEDS = ['_id', 'enquiry_no', 'create_time', 'bid_amount']; const validSortOption = {}; Object.keys(sortOption).forEach(field => { if (ALLOW_SORT_FILEDS.includes(field)) { validSortOption[field] = sortOption[field]; } }) // 后续查询使用validSortOption作为排序参数即可
内容的提问来源于stack exchange,提问作者Alok007
相关产品推荐
相关产品推荐

