npm i method-override
// app.js

const methodOverride = require('method-override')
app.use(methodOverride('_method'))

路由建立

// routes/index.js

router.post('/cartItem/:id/add', cartController.addCartItem)
router.post('/cartItem/:id/sub', cartController.subCartItem)
router.delete('/cartItem/:id', cartController.deleteCartItem)

新增 controller

// controllers/cartController.js

// 增加商品數量
  addCartItem: async (req, res) => {
    try {
      const cartItem = await CartItem.findByPk(req.params.id)
      cartItem.update({
        quantity: cartItem.quantity + 1
      })
      return res.redirect('back')
    } catch (e) {
      console.log(e)
    }
  },
  // 減少商品數量
  subCartItem: async (req, res) => {
    try {
      const cartItem = await CartItem.findByPk(req.params.id)
      cartItem.update({
        quantity: cartItem.quantity - 1 >= 1 ? cartItem.quantity - 1 : 1
      })
      return res.redirect('back')
    } catch (e) {
      console.log(e)
    }
  },
  // 刪除商品
  deleteCartItem: async (req, res) => {
    try {
      const cartItem = await CartItem.findByPk(req.params.id)
      cartItem.destroy()
      return res.redirect('back')
    } catch (e) {
      console.log(e)
    }
  }
// controllers/productController.js

// 取所有產品
  getProducts: async (req, res) => {
    try {
      const products = await Product.findAndCountAll({ offset: 0, limit: 3 })
      let cart = await Cart.findByPk(req.session.cartId, {
        include: 'items'
      })
      cart = cart || { items: [] }
      const totalPrice = cart.items.length > 0 ? cart.items.map(d => d.price * d.CartItem.quantity).reduce((a, b) => a + b) : 0
      return res.render('products', { products, cart, totalPrice })
    } catch (e) {
      console.log(e)
    }
  }
// views/products.hbs

<nav class="col-md-3 d-none d-md-block bg-light sidebar">
        <div class="sidebar-sticky">
            <ul class="list-group list-group-flush">
                <li class="list-group-item">
                    {{#each cart.items}}
                        <div class="row no-gutters">
                            <div class="col-md-4" style="display: flex;align-items: center;">
                                <img src="{{this.dataValues.image}}" class="card-img" alt="...">
                            </div>
                            <div class="col-md-8">
                                <div class="card-body">
                                    <h5 class="card-title">{{this.dataValues.name}}</h5>
                                    <p>${{this.dataValues.price}}</p>
                                    <div class="btn-group">
                                        <form action="/cartItem/{{this.CartItem.dataValues.id}}/add" method="POST">
                                            <button type="submit" class="btn btn-sm btn-outline-secondary">+</button>
                                        </form>
                                        <span style="margin: 0 20px;">{{this.CartItem.dataValues.quantity}}</span>
                                        <form action="/cartItem/{{this.CartItem.dataValues.id}}/sub" method="POST">
                                            <button type="submit" class="btn btn-sm btn-outline-secondary">-</button>
                                        </form>

                                        <form action="/cartItem/{{this.CartItem.dataValues.id}}?_method=DELETE" method="POST">
                                            <button type="submit" class="btn btn-link">
                                                <i class="fas fa-trash"></i>
                                            </button>
                                        </form>

                                    </div>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </li>
            </ul>
            <hr>
            <li class="list-group-item">
                Total: ${{totalPrice}}
                <a href="/cart"><button class="btn btn-primary">Go to Cart</button></a>
            </li>

        </div>
    </nav>