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

TypeError: filter.split非函数或返回值不可迭代问题求助

问题排查与解决

错误信息

TypeError: filter.split 不是函数或其返回值不可迭代
在 Object.getFilterString (/cb-api/helpers/processQuery/index.js:341:42)
在 get (/cb-api/routes/v3/data-browser-configurations/index.js:66:50)
在 runMicrotasks ()
在 processTicksAndRejections (node:internal/process/task_queues:96:5)
Promise 未处理的拒绝 Promise {
TypeError: filter.split 不是函数或其返回值不可迭代
在 Object.getFilterString (/cb-api/helpers/processQuery/index.js:341:42)
在 get (/cb-api/routes/v3/data-browser-configurations/index.js:66:50)
在 runMicrotasks ()
在 processTicksAndRejections (node:internal/process/task_queues:96:5)

问题根源

现有类型检查逻辑存在漏洞,导致非字符串类型的filter绕过检查,最终触发split调用失败:

// 原检查逻辑
if (filter == '' || filter == null || typeof filter !== 'string') {
    return '您提供的筛选器值无效。'
}
  • 隐式类型转换干扰:==会将0、false等非空值判定为与空字符串相等,但却会放过数组、对象等非字符串类型(这类值与''、null的==判断均为false)。
  • 检查顺序错误:类型判断(typeof)放在最后,前面的条件无法拦截所有非字符串场景。

解决方案

1. 修正类型检查逻辑

优先检查filter是否为字符串类型,再判断是否为空值,彻底拦截所有无效输入:

// 修正后的检查逻辑
if (typeof filter !== 'string' || filter.trim() === '') {
    return '您提供的筛选器值无效。'
}
  • typeof filter !== 'string'直接拦截数组、对象、数字等所有非字符串类型。
  • filter.trim() === ''拦截空字符串或全空格的无效筛选值。

2. 完整修正后的函数

getFilterString: (parameters, excludedParametersArray = []) => {
    let searchQuery = ''
    // 构建查询语句
    for (const column in parameters) {
        let filter = parameters[column]
        let valueList = ''
        let columnString = ''
        let count = 0
        let value = ''

        // 严格类型与有效值检查
        if (typeof filter !== 'string' || filter.trim() === '') {
            return '您提供的筛选器值无效。'
        } else {
            if (!excludedParametersArray.includes(column)) {
                if (column.includes('Timestamp')) {
                    columnString = `to_char("${column}",'yyyy-mm-dd')`
                } else if (column.toUpperCase() === column) {
                    columnString = `lower("${column}")->>'variableValue'`
                } else if (column === 'fieldLocation') {
                    columnString = `lower("${column}")->>'display_name'`
                } else if (column === 'parentage') {
                    columnString = `RTRIM(lower("${column}"))`
                } else {
                    columnString = `lower("${column}"::text)`
                }
                
                // 解析值
                for (value of filter.split('|')) {
                    valueList += `$$${value.trim().toLowerCase()}$$,`
                    count++
                }

                // 设置条件
                let condition = ''
                if (count > 1) {
                    valueList = valueList.replace(/(^,)|(,$)/g, "")
                    condition = `${columnString} IN (${valueList})`
                } else {
                    const processedValue = value.trim().toLowerCase()
                    if (columnString.includes('Id')) {
                        condition = `${columnString} = '${processedValue}'`
                    } else {
                        condition = `${columnString} ILIKE '${processedValue}%' `
                    }
                }

                // 拼接查询语句
                if (searchQuery === '') {
                    searchQuery = ` WHERE ${condition}`
                } else {
                    searchQuery = `${searchQuery} AND ${condition}`
                }
            }
        }
    }
    return searchQuery
},

额外优化点

  • 用===替代==,避免隐式类型转换的意外问题。
  • 使用模板字符串简化字符串拼接,提升代码可读性。
  • 提前声明value变量,避免单值处理时的未定义风险。
  • 循环中用const声明column,避免变量泄漏。

内容的提问来源于stack exchange,提问作者tetsuya kuroko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:15:40