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
相关产品推荐
相关产品推荐

