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개를 나타낸다.

github : https://github.com/gmldbd94/node_express_mongoDB