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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:12:07