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
相关产品推荐
相关产品推荐

