Stripe获取产品价格报错:TypeError: Cannot add property 0, object is not extensible
问题分析与解决方案
错误原因
- 不必要的对象不可扩展设置:你调用了
Object.preventExtensions(retObj)将合并后的对象标记为不可扩展,后续尝试将该对象添加到数组时,某些隐式操作(如环境或工具的内部属性注入)试图给对象添加新属性,触发了Cannot add property 0, object is not extensible错误。 - 异步操作处理不当:使用
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
相关产品推荐
相关产品推荐

