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

如何在Mongoose Promise间传递数据?实现用户购车功能的技术问询

实现用户购买车辆并关联至用户文档的完整方案

我来帮你完善这个buyVehicle函数的实现,确保它能稳定完成「查询车辆信息并关联到已登录用户文档」的需求。先给你完整的代码实现,再拆解关键逻辑:

// 假设已经引入Vehicles和Users Schema,且用户认证中间件已处理(req.user包含当前登录用户信息)
async function buyVehicle(req, res) {
  try {
    // 1. 从请求体获取目标车辆ID
    const { vehicleId } = req.body;

    // 校验参数有效性
    if (!vehicleId) {
      return res.status(400).json({ message: "请提供有效的车辆ID" });
    }

    // 2. 查询对应车辆的完整信息
    const targetVehicle = await Vehicles.findOne({ vehicleId }).exec();

    // 校验车辆是否存在
    if (!targetVehicle) {
      return res.status(404).json({ message: "未找到指定车辆" });
    }

    // 3. 将车辆信息添加到已登录用户的文档中
    // 假设用户文档有ownedVehicles数组字段存储已购车辆
    // 使用$addToSet避免重复添加同一辆车,允许重复则替换为$push
    const updatedUser = await Users.findByIdAndUpdate(
      req.user._id, // 已登录用户ID由认证中间件提供
      { $addToSet: { ownedVehicles: targetVehicle.toObject() } },
      { new: true, runValidators: true } // 返回更新后的用户文档并触发Schema校验
    ).exec();

    if (!updatedUser) {
      return res.status(404).json({ message: "未找到当前登录用户" });
    }

    // 4. 返回成功响应
    res.status(200).json({
      message: "车辆购买成功",
      user: updatedUser,
      purchasedVehicle: targetVehicle
    });
  } catch (error) {
    // 统一处理异常
    console.error("购买车辆时出错:", error);
    res.status(500).json({ message: "服务器内部错误", error: error.message });
  }
}

关键逻辑拆解

  • 参数校验:先检查vehicleId是否存在,拦截无效请求
  • 车辆查询:用Vehicles.findOne()精准匹配vehicleId,确保拿到完整车辆数据
  • 用户关联:
    • 依赖认证中间件(如JWT、Passport)确保req.user携带当前登录用户ID
    • $addToSet操作符避免用户重复购买同一辆车,业务允许重复则改用$push
    • new: true配置确保返回更新后的用户文档,方便前端同步状态
  • 异常处理:用try/catch捕获数据库操作、参数错误等所有异常,返回清晰的错误提示

额外注意事项

  • 需在Users Schema中提前定义ownedVehicles字段(例如ownedVehicles: [{ type: mongoose.Schema.Types.Mixed, default: [] }],或更严格的子文档结构)
  • 生产环境建议添加幂等性处理,防止重复提交请求导致的异常
  • 可根据业务需求扩展权限校验(如用户余额检查、车辆库存校验等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:57:24