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

Prisma+NextJS/ReactJS:循环中查询结果无法存入产品对象

问题原因及解决方案:异步forEach的执行时机问题

第一种写法失效的核心原因

  • forEach不等待异步回调:forEach会快速遍历所有元素,把每个async回调函数直接丢进事件队列就继续执行后续代码,完全不会等待这些异步操作完成。你在forEach之后立刻调用res.send(products)时,那些await getImages(81)的异步请求还处于等待状态,products数组根本还没被添加上images字段。
  • 另外你用index++修改数组的方式本身也有风险:异步回调的执行顺序是不确定的,index的递增逻辑可能和遍历顺序不匹配,但这不是导致字段不生效的主要原因。

第二种写法生效的原因

你提前用await拿到了images数据,此时images已经是同步可用的结果了。forEach里的赋值操作是同步执行的,等你调用res.send(products)时,数组里的每个产品都已经被加上了images字段,所以能正常返回。

正确的实现方式

方式1:用Promise.all+map等待所有异步操作完成

if (req.method == "GET") {
  const products = await prisma.product.findMany();
  // 用map生成每个产品带图片的Promise,等待所有Promise执行完成
  const productsWithImages = await Promise.all(
    products.map(async (product) => {
      const images = await getImages(product.id);
      return { ...product, images };
    })
  );
  return res.send(productsWithImages);
}

方式2:直接用Prisma关联查询(更推荐,性能更优)

先确保你的Prisma Schema中已经定义了Product和ProductImage的关联关系:

model Product {
  id        Int             @id @default(autoincrement())
  // 你的其他产品字段
  images    ProductImage[]
}

model ProductImage {
  id         Int      @id @default(autoincrement())
  product_id Int
  // 你的其他图片字段
  product    Product  @relation(fields: [product_id], references: [id])
}

然后通过include直接一次查询拿到所有产品及对应图片,避免多次数据库请求:

if (req.method == "GET") {
  const productsWithImages = await prisma.product.findMany({
    include: {
      images: true
    }
  });
  return res.send(productsWithImages);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:55:25