본문 바로가기
IT/web

Node.js] 게시판 만들기5 // 댓글 기능 (findByIdAndUpdate)

by 깻잎쌈 2020. 2. 24.
반응형

views/showpost.ejs

댓글 입력하는 곳과 저장된 댓글보여줌.

<!-- 댓글 -->
<br>
<form method="post" action="/process/addcomment">
    <label>댓글 </label>
    <br>
    <input type="text" name="commentText" value="">
    <input type="hidden" name="id" value="<%=posts._doc._id%>">
    <input type="hidden" name="writer" value=" <%=curWriter %>">
    <input type="submit" value="입력완료">

</form>
 
<br><br> <!-- 댓글 목록--> <label>댓글 목록 </label> <br><br> <% for(var i = 0; i<posts._doc.comments.length; i++){ var curCmts = posts._doc.comments[i].contents; var curCmtWriter = posts._doc.comments[i].writer; %> #<%=(i+1) %> &nbsp; <%=curCmts %> &nbsp; <%= curCmtWriter %> <!-- #1 댓글 내용 작성자 이름 --> <br> <% } %>

 

config/config.js 

/process/addcomment 추가하고 

 

routes/post.js

댓글추가 함수 추가

#findByIdAndUpdate

 

Mongoose v5.9.2: API docs

 

mongoosejs.com

//댓글 추가 
var addComment = function(req,res){
    console.log('post.js의 addcomment 호출됨');

    var paramId = req.body.id || req.query.id; // 댓글말고 본 글의 아이디
    var paramComments = req.body.commentText || req.query.commentText; //  댓글 내용
    var paramWriter = req.body.writer || req.query.writer;

    console.log('parameter : ' + paramId + ', ' + paramComments + ', ' + paramWriter);

    var database = req.app.get('database');
    
    if(database) {
        database.postModel.findByIdAndUpdate(paramId, {$push :{comments:{contents:paramComments, writer: paramWriter}}}, function(err){
            if(err){
                console.log('댓글 추가 중 에러 발생 : ' +err.stack);

                res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
                res.write('<h2>게시판 댓글 추가 중 에러 발생</h2>');
                res.end();
                
                return;           
            }
            
            console.log('댓글 추가 완료 ');
            
            return res.redirect('/process/showpost/' + paramId);
        });
        
        
    } else {
        res.writeHead('200', {
            'Content-Type': 'text/html;charset=utf8'
        });
        res.write('<h2>데이터베이스 연결 실패</h2>');
        res.end();
    }
}

 

database/post_schema.js 

스키마 및 메소드 수정

  },
        comments: [{
            contents: {
                type: String,
                trim: true,
                default: ''
            },
            writer: {
                type: String,
                ref: 'users6'
            },
            created_at: {
                type: Date,
                default: Date.now
            }
        }]
        
        ...
    //id로 글 찾기 
        load: function (id, callback) {
            this.findOne({
                    _id: id
                })
                .populate('writer', 'name provider email')
              //  .populate('comments.writer')
                .exec(callback);
        },     

 

반응형

댓글