Post로 hidden data보내기

<form action="/cart" method="post">
  <button class="btn" type="submit">Add to Cart</button>
  <input type="hidden" name="productId" value="<%= product.id %>" />
</form>

위와 같은 형식으로 구성하면, 해당 페이지에서 POST request를 보낼 때 숨겨져있는 value productId를 추가해서 보낼 수 있다.

순수 MongoDB로 MVC 구성하기

ODM을 안쓰고 Mongo를 쓸 일이 있을까 싶지만, 항상 Base를 아는 것이 중요하니 남긴다.

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

let _db;

const mongoConnect = callback => {
  MongoClient.connect('mongodb://localhost:27017/shop')
    .then(client => {
      console.log('Connected!');
      _db = client.db();
      callback();
    })
    .catch(err => {
      console.log(err);
      throw err;
    });
};

const getDb = () => {
  if (_db) {
    return _db;
  }
  throw 'No database found!';
};

exports.mongoConnect = mongoConnect;
exports.getDb = getDb;

이 방법을 통해, 서버 시작시 MongoDB와의 Connection을 시작하고, getDb를 통해 이후 사용시 새로운 Connection을 만들지 않고 사용. Connection Pool 관리는 이후에 다룬다.

Save Procedure

class Product {
  /** Constructor **/

  save() {
    const db = getDb();
    let dbOp;
    if (this._id) {
      // Update the product
      dbOp = db
        .collection('products')
        .updateOne({ _id: this._id }, { $set: this });
    } else {
      dbOp = db.collection('products').insertOne(this);
    }
    return dbOp
      .then(result => {
        console.log(result);
      })
      .catch(err => {
        console.log(err);
      });
  }
}

현재 id가 배정되어 있으면 update를 진행 / 없으면 insert를 진행

흐름 파악하기

Router -> Controller -> Model 순으로 접근 후 Rendering 되는 것이라 생각하면 된다.

// Router
router.get('/cart', shopController.getCart);

// Controller
exports.getCart = (req, res, next) => {
  req.user
    .getCart()
    .then(products => {
      res.render('shop/cart', {
        path: '/cart',
        pageTitle: 'Your Cart',
        products: products
      });
    })
    .catch(err => console.log(err));
};

// Model
function getCart() {
  const db = getDb();
  const productIds = this.cart.items.map(i => {
    return i.productId;
  });
  return db
    .collection('products')
    .find({ _id: { $in: productIds } })
    .toArray()
    .then(products => {
      return products.map(p => {
        return {
          ...p,
          quantity: this.cart.items.find(i => {
            return i.productId.toString() === p._id.toString();
          }).quantity
        };
      });
    });
}