NodeJS: Knowhows
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
};
});
});
}