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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:52:44