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

Stripe获取产品价格报错:TypeError: Cannot add property 0, object is not extensible

问题分析与解决方案

错误原因

  1. 不必要的对象不可扩展设置:你调用了Object.preventExtensions(retObj)将合并后的对象标记为不可扩展,后续尝试将该对象添加到数组时,某些隐式操作(如环境或工具的内部属性注入)试图给对象添加新属性,触发了Cannot add property 0, object is not extensible错误。
  2. 异步操作处理不当:使用forEach遍历处理异步请求时,forEach不会等待异步任务完成,导致getProducts函数返回时,products数组仍为空,同时异步回调的数组操作也可能引发上下文异常。

修复代码

export async function getProducts() {
  const allProducts = await stripe.products.list({
    limit: 20,
  });

  // 用map+Promise.all等待所有异步任务完成
  const products = await Promise.all(
    allProducts.data.map(async (product) => {
      const price = await formatData(product);
      // 合并属性生成新对象,无需设置不可扩展
      return Object.assign({}, product, { price });
    })
  );

  console.log(products);
  return products;
}

async function formatData(product) {
  const checkPrice = product.default_price || "price_1Nv9YHIBI5Cn7b3ccsEn9Vpi";
  const price = await stripe.prices.retrieve(checkPrice);
  return price.unit_amount;
}

修复说明

  • 移除Object.preventExtensions:合并后的对象仅用于数据返回,无需限制其扩展性,该操作是报错的直接诱因。
  • 改用map+Promise.all:替代forEach处理异步逻辑,确保所有价格查询任务完成后再返回完整的产品数组,解决原函数返回空数组的问题,同时让代码逻辑更清晰。
  • 简化异步流程:用async/await替代嵌套的then链,提升代码可读性和可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:45:54