如何在Promise.all()中返回含用户数据与金额的嵌套对象?
问题分析与解决方案
核心问题
你返回空对象的原因是:在map函数中直接返回包含未解析Promise的对象时,Promise.all无法正确等待这些Promise完成。users.findOne返回的是Promise,当你直接把{user: us, amount: user.amount}放入数组时,Promise.all只会处理数组中的元素本身,而不会等待对象内部的Promise解析,最终序列化时未完成的Promise会变成空对象。
修复代码
import users from "@/models/users"; import { NextResponse } from "next/server"; import bcrypt from "bcryptjs"; import dbConnect from "@/util/mongodb"; export async function GET(req, { params }) { await dbConnect(); try { const data = await users.findOne({ username: params.id }, { pin: 0 }); // 处理用户不存在的情况 if (!data) { return NextResponse.json({ message: "用户不存在" }, { status: 404 }); } const history = await Promise.all( data.history.map(async (item) => { // 改为async函数 const userData = await users.findOne( { _id: item.id }, { firstname: 1, username: 1, lastname: 1 } ); // 返回组合后的对象,确保userData已解析 return { user: userData, amount: item.amount }; }) ); return NextResponse.json(history, { status: 200 }); } catch (err) { return NextResponse.json({ error: err.message }, { status: 500 }); } }
关键修改点
- 将
map的回调改为async函数,这样内部可以使用await等待users.findOne的结果。 - 在回调中先
await获取关联用户数据,再返回包含user和amount的组合对象,确保Promise.all能正确等待所有异步操作完成。 - 添加了用户不存在的判断,避免因
data为null导致data.history报错。
内容的提问来源于stack exchange,提问作者crayonne
相关产品推荐
相关产品推荐

