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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:03