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

使用HubSpot API出现Cannot read properties of undefined报错求助

解决HubSpot工作流自定义代码的TypeError问题

错误原因分析

TypeError: Cannot read properties of undefined (reading 'properties') 说明你代码中尝试访问的results.body是undefined,大概率是以下两种情况:

  • API请求失败(比如权限不足、Deal ID错误、端点写错),返回的响应没有预期的body结构
  • 你对HubSpot API的响应结构判断错误,实际返回的字段路径和你写的results.body.properties不匹配

排查与修复步骤

1. 先打印完整响应排查结构

在报错代码前添加日志,打印API请求的完整返回结果,明确实际响应内容:

// 在读取properties之前添加这行
console.log('API Response Details:', results);

运行工作流后查看日志,确认:

  • 响应状态码(status字段)是否为200(成功)
  • body字段的实际结构是什么,是否包含properties

2. 检查API请求的正确性

确认请求URL与参数

HubSpot获取单个Deal的正确API端点是:

https://api.hubapi.com/crm/v3/objects/deals/{dealId}?properties=start_date,duration

确保:

  • 用event.object.objectId正确获取当前触发工作流的Deal ID
  • 在URL中通过properties参数明确指定需要获取的start_date和duration,避免返回冗余数据

验证认证权限

确保你在工作流中配置的私有应用令牌(Private App Token)拥有Deals的读取权限,并且在代码中正确引用:

headers: {
  'Authorization': `Bearer ${context.secrets.HUBSPOT_PRIVATE_APP_TOKEN}`,
  'Content-Type': 'application/json'
}

3. 修复代码逻辑(带错误处理)

以下是经过验证的完整代码示例,包含错误处理和结构校验:

exports.main = async (event, callback) => {
  try {
    // 获取当前Deal的ID
    const dealId = event.object.objectId;
    // 调用HubSpot API获取指定属性
    const response = await hs.request({
      method: 'GET',
      url: `https://api.hubapi.com/crm/v3/objects/deals/${dealId}?properties=start_date,duration`,
      headers: {
        'Authorization': `Bearer ${context.secrets.HUBSPOT_PRIVATE_APP_TOKEN}`,
        'Content-Type': 'application/json'
      }
    });

    // 检查请求是否成功
    if (response.status !== 200) {
      throw new Error(`API请求失败: 状态码 ${response.status}, 错误信息: ${JSON.stringify(response.body)}`);
    }

    // 校验响应结构是否符合预期
    if (!response.body || !response.body.properties) {
      throw new Error('API响应结构不符合预期,未找到properties字段');
    }

    // 提取属性并计算结束日期
    const { start_date, duration } = response.body.properties;
    const startDate = new Date(start_date);
    const daysToAdd = parseInt(duration, 10);
    
    if (isNaN(startDate.getTime()) || isNaN(daysToAdd)) {
      throw new Error('start_date或duration格式无效,无法计算结束日期');
    }

    const endDate = new Date(startDate);
    endDate.setDate(startDate.getDate() + daysToAdd);

    // 返回计算结果(可根据需求更新Deal或输出到工作流)
    callback({
      outputFields: {
        end_date: endDate.toISOString().split('T')[0] // 格式化为YYYY-MM-DD
      }
    });
  } catch (error) {
    console.error('执行出错:', error);
    callback({
      error: error.message
    });
  }
};

4. 检查属性配置

确认你的Deal对象中确实存在start_date和duration这两个属性,并且属性的内部名称(不是显示名称)和代码中使用的一致(比如start_date是内部名称,而不是“开始日期”)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:44:54