2022이전/node.js
Nodejs, express, MongDB를 이용한 CRUD(4)_Controller_board.js
바로퇴장
2020. 1. 12. 20:15
module.exports = {
// 게시글 작성하기
create: async (req, res) =>{
const { title, content, user } = req.body;
console.log(content);
console.log(title);
const find_user = await User.findById(user._id);
const board = await Board.create({
title,
content: req.body.content,
user: find_user
});
const result = await board.save();
console.log(result.user_id);
return res.json(result);
},
// 특정 게시글 불러오기
read: async (req, res) =>{
const result = await Board.findById(req.params.board_id)
.populate('user','name')
.populate({path: 'comments',
select: 'content re_comments',
populate: {
path: 'user re_comments',
select: 'email name content user',
populate: {
path: 'user',
select: 'email name'
}
}
});
return res.json(result);
},
// 모든 게시글 불러오기
all: async (req, res) =>{
const page_num = req.params.page_num;
const count_board = await Board.countDocuments();
const max_page = Math.ceil(count_board/3);
console.log(max_page);
let result = await Board.find()
.populate('user','name email')
.skip(page_num * 3 - 3)
.limit(3)
result.push({"max_page": max_page});
return res.json(result);
}
}
populate
외래키를 통하여 참조된 값까지 불러오는 값까지 불러온다.
board의 user_id값은 외래키로 저장이 되어 있기에 게시글의 작성자 이름을 알 수 없다.
하지만 .populate('user', 'name')
을 사용한다면 user의 이름까지 불러올 수 있다.(json형태)
그리고 populate 된 내용을 populate를 또 하고 싶다면 json형태로 하위 참조값들을 불러오면 된다. populate({path: 'comments', populate:{path: 'user', select:'name'}})
이런식으로 작성하면 된다.
Pagination
우리가 흔히 게시물을 볼 때 한번에 다 보지 않고 게시물 10개씩 또는 20개씩 페이지네이션을 통하여 게시글을 본다.
이를 위해서 일단 pagination의 마지막 페이지의 값을 알아야한다. mongoDB에서는 countDoucments()
함수를 통하여 Documents의 총 갯수를 가져 올 수 있다. 이를 통해서 마지막페이지를 설정을 해주고 내가 한번에 보고 싶은 게시글 수정를 정해주고 페이지네이션을 값을 만들면 된다.(client에서 처리)
let result = await Board.find()
.populate('user','name email')
.skip(page_num * 3 - 3)
.limit(3)
위에 있는 코드는 Board의 document을 page_num 만큼 skip을 하고 값을 불러오고 그 갯수를 3개를 나타낸다.