Node.js映射API返回数据时报Cannot read properties of null错误解决方法
问题根源
你之前写的row.c[1].v || ''没有生效,核心原因是报错发生在读取.v属性之前:当row.c[1]本身为null时(比如分类行的第2到第4个c元素都是null),直接访问null.v会立刻抛出Cannot read properties of null错误,代码根本执行不到后面的|| ''兜底逻辑。||只能处理row.c[1].v已经成功取到、但值为假值的场景,覆盖不了中间属性为null的情况。
可靠解决方案
方案1:可选链+空值合并(现代JS环境首选,写法最简洁)
ES2020 新增的可选链操作符?.支持在链式访问属性时,只要中间任意一环是null/undefined就直接返回undefined,不会抛出错误,搭配空值合并操作符??设置默认值即可:
const result = json.map((row) => { return { name: row.c?.[0]?.v ?? '', sku: row.c?.[1]?.v ?? '', inventory: row.c?.[2]?.v ?? '', eta: row.c?.[3]?.v ?? '', access: row.c?.[4]?.v ?? '', }; });
注意优先用
??而非||做兜底:||会把合法的假值(比如数值0、空字符串)也替换成默认值,??仅在值为null/undefined时才生效,更适配接口数据处理场景。
方案2:前置过滤无效行(不需要保留分类条目时推荐)
如果分类这类非产品行不需要出现在最终结果里,可以在映射前先过滤掉结构不符合产品规则的条目,从根源减少无效判断:
const result = json // 判定规则:c为数组、长度达标、SKU位有有效值,才认为是产品行 .filter(row => Array.isArray(row.c) && row.c.length >= 5 && row.c[1]?.v) .map((row) => ({ name: row.c[0].v, sku: row.c[1].v, inventory: row.c[2]?.v ?? '', eta: row.c[3]?.v ?? '', access: row.c[4]?.v ?? '', }));
这种写法的优势是最终返回的都是结构合规的产品数据,后续业务逻辑不需要额外判断条目类型。
方案3:通用安全取值函数(兼容不支持可选链的旧环境)
如果运行环境不支持ES2020语法(比如低版本Node、IE浏览器),可以封装一个逐层校验的安全取值工具函数:
// 安全取值工具,按路径逐层访问属性,取不到就返回默认值 function getValue(target, path, defaultValue = '') { return path.reduce((current, key) => { if (current === null || current === undefined) return defaultValue; return current[key]; }, target); } const result = json.map((row) => ({ name: getValue(row, ['c', 0, 'v']), sku: getValue(row, ['c', 1, 'v']), inventory: getValue(row, ['c', 2, 'v']), eta: getValue(row, ['c', 3, 'v']), access: getValue(row, ['c', 4, 'v']), }));
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

