javascript TypeError:无法添加属性0,对象不可通过Stripe扩展

8tntrjer  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(68)

我试图从Stripe内部的产品电话中获得价格。我有功能工作的大部分,但是,我得到了这个错误时,添加价格。我已经尝试了Object.assignObject.preventExtensions的每一种可能的排列。我很感激在这个问题上的一些帮助,因为它一直困扰着我。

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

  allProducts.data.forEach((product) => {
    formatData(product)
      .then((price) => {
        console.log(price);
        const retObj = Object.assign({}, product, { price });
        console.log(retObj);
        Object.preventExtensions(retObj);
        return retObj;
      })
      .then((finalFormat) => {
        products.push(finalFormat);
      });
  });
  console.log(products);

  return products;
}

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

此代码在点products.push(finalFormat)处返回错误TypeError: Cannot add property 0, object is not extensible

jv4diomz

jv4diomz1#

猜测您正在对getProducts返回的对象执行某些操作
getProducts返回EMPTY Array,因为forEach中的代码有缺陷。这里的.then中的代码formatData(product).then(...不会在你return products之前执行,因为它是异步的。
试试这个

export async function getProducts() {
    const allProducts = await stripe.products.list({
        limit: 20,
    });
    return Promise.all(
        allProducts.data.map((product) =>
            formatData(product).then((price) => {
                console.log(price);
                const retObj = Object.assign({}, product, { price });
                console.log(retObj);
                Object.preventExtensions(retObj);
                return retObj;
            })
        )
    );
}

举例说明这一点
这段代码不会导致该错误,但您可以看到结果长度为零。如果您签入实际的控制台,则会有数据,这是因为它是在日志记录之后异步添加的

async function getProducts() {
    let products = [];
    [1,2,3].forEach((v) => {
        new Promise(r => setTimeout(r, 1))
        .then(() => products.push(v))
        .catch(err => {
          console.log(err.message);
          throw err;
        });
    });
    return products;
}
async function test() {
    const result = await getProducts();
    console.log(result.length, result);
}
test();

这个例子,我假设您在调用getProducts时正在做的事情,说明了您得到的确切错误。

async function getProducts() {
    let products = [];
    [1,2,3].forEach((v) => {
        new Promise(r => setTimeout(r, 1))
        .then(() => products.push(v))
        .catch(err => {
          console.log(err.message);
          throw err;
        });
    });
    return products;
}
async function test() {
    const result = await getProducts();
    Object.preventExtensions(result);
    console.log(result.length, result);
}
test();

相关问题