如何在 Nodejs 和 Express 中计算和 return 购物车商品总数

How to Calculate and return a total cart items in Nodejs and Express

我已经在这个代码上来回切换了一段时间,我试图在购物车对象中有一个 totalQty 值,returns 购物车中的商品总数,我想当然,在导航中购物车图标旁边的视图中使用该值。这是我的用户模型和路由代码:

用户模型:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const userSchema = new Schema({
  role: {
    type: String,
    default: 'BASIC'
  },
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  address: {
    type: String
  },
  apartment: {
    type: String
  },
  country: {
    type: String
  },
  state: {
    type: String
  },
  city: {
    type: String
  },
  zip: {
    type: String
  },
  phone: {
    type: String
  },
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  resetToken: String,
  resetTokenExpiration: Date,
  cart: {
    items: [
      {
        productId: {
          type: Schema.Types.ObjectId,
          ref: 'Product',
          required: true
        },
        quantity: { type: Number, required: true }
      },
    ],
    totalQty: {
      type: Number,
      default: 0
    }
  }
}, { timestamps: true });

userSchema.methods.addToCart = function (product) {
  const cartProductIndex = this.cart.items.findIndex(cp => {
    return cp.productId.toString() === product._id.toString();
  });
  let newQuantity = 1;
  // let newTotalQty = 1;

  const updatedCartItems = [...this.cart.items];

  if (cartProductIndex >= 0) {
    newQuantity = this.cart.items[cartProductIndex].quantity + 1;
    updatedCartItems[cartProductIndex].quantity = newQuantity;

    newTotalQty = this.cart.totalQty + 1;
    updatedTotalQty = newTotalQty;

  } else {
    updatedCartItems.push({
      productId: product._id,
      quantity: newQuantity
    });
  }

  const updatedCart = {
    items: updatedCartItems,
    totalQty: updatedTotalQty

  };
  this.cart = updatedCart;
  return this.save();
};

userSchema.methods.removeFromCart = function (productId) {
  const updatedCartItems = this.cart.items.filter(item => {
    return item.productId.toString() !== productId.toString();
  });
  this.cart.items = updatedCartItems;
  return this.save();
};

userSchema.methods.clearCart = function () {
  this.cart = { items: [] };
  return this.save();
};

module.exports = mongoose.model('User', userSchema);

用户路线:

exports.getCart = (req, res, next) => {
  // populate req user
  req.user
    .populate('cart.items.productId')
    .execPopulate()
    .then(user => {
      const products = user.cart.items;
      // render cart view
      res.render('shop/cart', {
        path: '/cart',
        pageTitle: 'Cart - Hashing365.com',
        products: products
      });
    })
    .catch(err => {
      const error = new Error(err);
      error.httpStatusCode = 500;
      return next(error);
    });
};

exports.postCart = (req, res, next) => {
  // extract prod ID
  const prodId = req.body.productId;
  // run DB find with prod ID
  Product.findById(prodId)
    .then(product => {
      // return true && add to cart
      return req.user.addToCart(product);
    })
    .then(result => {
      // re-render same page
      res.redirect('back');
    })
    .catch(err => {
      const error = new Error(err);
      error.httpStatusCode = 500;
      return next(error);
    });
};

如果有人能帮我解决这个问题,我将不胜感激。谢谢!

您可以查看 Array reducer function。它应该是这样的

cart.totalQty = cart.items.reduce((sum, item)=>{
    return sum + item.quantity;
},0);