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

MongoDB中购物车可创建但无法添加商品问题求助

基于MongoDB的购物车添加商品失败排查与修复

问题描述

开发基于MongoDB的购物车功能时,能成功创建购物车,但无法将商品添加至购物车。控制台及Robo 3T均显示items数组为空。

现有代码

路由代码

const express = require('express');
const Carts = require('../repo/carts');

const router = express.Router();

router.post('/cart/products', async (req, res) => {

  Carts.findById(req.session.cartId, (err, foundCart) => {
    if(err) {
      console.log(err)
    }
    if (foundCart) {
      console.log(foundCart);
      Carts.update( { _id:req.session.cartId }, {
        $push: {
          items: {
            _id: req.body.productId,
            quantity: 1,
          },
        },
      });
    } else {
      if (!foundCart) {
        const newCart = new Carts({
          _id: req.session.cartId,
          items: [],
        });
        newCart.save();
      }
    } 
  });

  res.send('product added to cart!!');
});

module.exports = router;

MongoDB购物车Schema

const mongoose = require('mongoose');

const cartSchema = new mongoose.Schema({
  _id: String,
  items: [
    { quantity: Number, _id: String,}
  ] 
});

const Carts = new mongoose.model('Carts', cartSchema);

module.exports = Carts;

购物车数据截图

购物车截图

问题排查与修复方案

核心问题分析

  1. 异步操作未等待完成:路由中直接在异步回调外部调用res.send(),导致数据库更新操作还未完成就返回响应,无法保证数据写入成功。
  2. 未处理异步操作的错误与结果:update和save都是异步方法,未等待其执行完成,也没有捕获可能的错误,无法确认操作是否成功。
  3. 创建购物车时未直接添加商品:新购物车创建时生成空items数组,没有直接加入当前要添加的商品。

修复后的路由代码

改用async/await语法统一处理异步操作,同时优化逻辑:

const express = require('express');
const Carts = require('../repo/carts');

const router = express.Router();

router.post('/cart/products', async (req, res) => {
  try {
    // 验证关键参数是否存在
    if (!req.session.cartId || !req.body.productId) {
      return res.status(400).send('参数缺失');
    }

    let foundCart = await Carts.findById(req.session.cartId);
    
    if (foundCart) {
      // 使用findByIdAndUpdate直接更新并返回最新文档
      foundCart = await Carts.findByIdAndUpdate(
        req.session.cartId,
        { $push: { items: { _id: req.body.productId, quantity: 1 } } },
        { new: true } // 返回更新后的文档
      );
      console.log('更新后的购物车:', foundCart);
    } else {
      // 新购物车直接加入当前商品
      const newCart = new Carts({
        _id: req.session.cartId,
        items: [{ _id: req.body.productId, quantity: 1 }]
      });
      await newCart.save();
      console.log('新创建的购物车:', newCart);
    }
    
    res.send('商品已添加至购物车!!');
  } catch (err) {
    console.error('操作失败:', err);
    res.status(500).send('添加商品失败,请重试');
  }
});

module.exports = router;

额外检查点

  • 确认req.session.cartId存在且有效:可在路由开头添加console.log('当前cartId:', req.session.cartId)验证。
  • 确认req.body.productId正确获取:检查请求是否携带了合法的商品ID参数,可通过console.log('商品ID:', req.body.productId)验证。
  • 匹配Schema类型:若商品ID是MongoDB的ObjectId类型,需将Schema中items._id的类型改为mongoose.Types.ObjectId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:31:03