URL查询filter参数转JSON对象始终返回空对象问题排查
问题原因
你的handleQueryFilter方法生成的字符串不符合JSON规范,导致JSON.parse抛出异常,最终进入catch分支返回空对象,具体问题如下:
- 未给JSON键名添加双引号:JSON语法要求对象的键必须用双引号包裹,你的代码仅处理了值的包裹,键
name没有加双引号,生成的{name:"jack"}不是合法JSON,JSON.parse会直接报错 - 正则匹配逻辑兼容性差:仅能处理单条件的极限情况,多条件(如
filter=name:jack,age:20)完全无法匹配,会生成非法字符串 - 字符串拼接逻辑不完整:你仅在开头拼接了
{,依赖正则补全末尾的},匹配失败就会生成残缺的JSON结构
修复方案
核心思路是拆分键值对后分别格式化,生成标准JSON字符串再解析,修复后代码如下:
const handleQueryFilter = (query) => { // 空参数直接返回空对象 if (!query) return {} try { // 按逗号拆分多个过滤条件 const filterPairs = query.split(',') const formattedPairs = filterPairs.map(pair => { // 按第一个冒号拆分键和值,兼容值本身带冒号的场景 const colonIndex = pair.indexOf(':') if (colonIndex === -1) return '' const key = pair.slice(0, colonIndex).trim() const value = pair.slice(colonIndex + 1).trim() // 键值都加双引号,生成合法JSON键值对片段 return `"${key}":"${value}"` }).filter(Boolean) // 过滤无效的空片段 const validJsonStr = `{${formattedPairs.join(',')}}` return JSON.parse(validJsonStr) } catch(err) { // 格式错误返回空对象 return {} } }
安全优化建议
直接将用户输入的过滤参数透传给数据库查询方法存在NoSQL注入风险,建议增加字段白名单校验:
// 定义允许作为过滤条件的字段白名单 const ALLOWED_FILTER_FIELDS = ['name', 'age', 'gender', 'id'] const rawFilter = handleQueryFilter(req.query.filter) // 过滤掉不允许的字段 const safeFilter = Object.fromEntries( Object.entries(rawFilter).filter(([key]) => ALLOWED_FILTER_FIELDS.includes(key)) ) let patients = await Patient.find(safeFilter);
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

