본문 바로가기
IT/web

Node.js] 게시판 만들기1 // 글 작성, 작성된 글 보기

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

스키마 정의하고 관련 함수 정의

 스키마 메소드 추가 ( 저장, 댓글 추가, 댓글 삭제) 

 

 // user6 컬렉션을 참고해서 이 문서 객체 중 objectid 속성값이 저장된다 . 
        writer: { 
            type: mongoose.Schema.ObjectId, 
            ref: 'users6' 
        },
var utils = require('../utils/utils');

var schemaObj = {};

schemaObj.createSchema = function (mongoose) {

    //스키마 정의 
    var postSchema = mongoose.Schema({
        title: {
            type: String,
            trim: true,
            'default': ''
        },
        contents: {
            type: String,
            trim: true,
            default: ''
        },
        
        // user 컬렉션을 참고해서 이 문서 객체 중 objectid 속성값이 저장된다 .
        writer: {
            type: mongoose.Schema.ObjectId,
            ref: 'users6'
        },
        tags: {
            type: [],
            default: ''
        },
        created_at: {
            type: Date,
            index: {
                unique: false
            },
            default: Date.now
        },
        updated_at: {
            type: Date,
            index: {unique: false},
            default: Date.now
        },
        comments: [{
            contents: {
                type: String,
                trim: true,
                default: ''
            },
            writer: {
                type: mongoose.Schema.ObjectId,
                ref: 'users6'
            },
            created_at: {
                type: Date,
                default: Date.now
            }
        }]
    });


    // 필수 항목 확인 
    postSchema.path('title').required(true, '글 제목을 입력하세요 ');
    postSchema.path('contents').required(true, '글 내용을 입력하세요 ');

    // 스키마 메소드 추가 
    //인스턴스에서 호출가능한 메소드 추가
    postSchema.methods = {
        // 글저장
        savePost: function (callback) {
            var self = this;

            this.validate(function (err) {
                if (err) return callback(err);

                self.save(callback);
            });
        },

        // 댓글 추가 
        addComment: function (user, comment, callback) {
            this.comment.push({ // 댓글이 배열로 정의되어있으니 push로 추가
                contents: comment.contents,
                writer: user._id
            });

            this.save(callback);
        },

        // 댓글 삭제 
        // id로 검색 후 삭제 
        removeComment: function (id, callback) {
            var index = utils.indexOf(this.comments, {
                id: id
            });

            if (~index) { // splice로 삭제
                this.comments.splice(index, 1);
            } else {
                return callback('ID [' + id + ']를 가진 댓글을 삭제할 수 없습니다');
            }

            this.save(callback);
        }
    }
    
    
    //객체에서 호출가능한 메소드 추가
    postSchema. statics = {
        
        //id로 글 찾기 
        load : function(id, callback){
            this.findOne({_id : id})
            .populate('writer' , 'name provider email')
            .populate('comments.writer')
            .exec(callback);
        },
        
        // 모든 데이터 조회
        list : function(options, callback){
            var criteria = options.criteria || {};
            
            this.find(criteria)
            .populate('writer', 'name provider email')
            .sort({'created_at' :-1})
            .limit(Number(options.perPage))
            .skip(options.perPage * options.page)
            .exec(callback);
        }
    }
    
    console.log('post schema 정의함 ');
    
    return postSchema;
    
}

module.exports = schemaObj;

 

라우팅 함수 정의 

var Entities = require('html-entities').AllHtmlEntities;


// 글 추가 
var addPost = function(req,res){
    console.log('post.js의 addpost 호출됨');
    
    var paramTitle = req.body.title || req.query.title;
    var paramContents = req.body.contents || req.query.contents;
    var paramWriter = req.body.writer || req.query.writer;
    
    console.log('parameter : '+paramTitle+ ', '+paramWriter);
    
    var database = req.app.get('database');
    
    if(database){
        database.userModel.findByEmail(paramWriter, function(err, results){
            if(err){
                console.log('게시판에 글 추가 중 오류 발생 '+ err.stack);
                
                res.writeHead('200', {'Contett-Type' : 'text/html;charset =utf8'});
                res.write('<h2>게시판에 글 추가 중 오류 발생</h2>')
                res.end();
                
                return;
            }
            
            if(results == undefined || results.length <1){
                res.writeHead('200', {'Content-Type' : 'text/html;charset=utf8'});
                res.write('<h2> 사용자 [ ' + paramWriter+ ']찾을 수 없음</h2>')
                res.end();
                
                return;
                
            }
            
            var userObjectId = results[0]._doc._id;
            console.log('사용자 objectid : '+paramWriter+ '=> '+userObjectId);
            
            //저장
            var post = new database.postModel({
                title : paramTitle,
                contents : paramContents,
                writer : userObjectId
            });
            
            post.savePost(function(err, result){
                if(err){throw err;}
                
                console.log('글 데이터 추가함 ');
                console.log('포스팅 완료 : '+ post._id);
                
                return res.redirect('/process/showpost/'+ post._id);

            });
            
        });
    }else {
		res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
		res.write('<h2>데이터베이스 연결 실패</h2>');
		res.end();
    }
}



//글 조회 
var showPost = function(req,res){
     console.log('post.js의 showpost 호출됨');
    
    var paramId = req.body.id || req.query.id || req.params.id;
    
    console.log('요청 파라미터 '+paramId);
    
    var database = req.app.get('database');
    
    if(database){
    // 글 리스트 
        database.postModel.load(paramId, function(err, result){
            if(err){
                console.log('게시판에 글 조회 중 오류 발생 '+ err.stack);
                
                res.writeHead('200', {'Contett-Type' : 'text/html;charset =utf8'});
                res.write('<h2>게시판에 글 조회 중 오류 발생</h2>')
                res.end();
                
                return;
            }
            
            if(result){
                console.log(result);
                
                // 뷰 렌더링
                res.writeHead('200', {'Contett-Type' : 'text/html;charset =utf8'});
                
                var context = {
                    title : '글 조회',
                    posts: result,
                    Entities : Entities
                };
                
                req.app.render('showpost', context, function(err, html){
                    if(err){
                        console.log('showpost 렌더링 중 오류 발생 ');
                        throw err;
                    }
                    
                    console.log('showpost 응답문서 : '+html);
                    res.end(html);
                });
            }
        })
           
    }else {
		res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
		res.write('<h2>데이터베이스 연결 실패</h2>');
		res.end();
    }
   
}


module.exports.addpost = addPost;
module.exports.showpost = showPost;

 

설정파일 추가 

module.exports = {
    
    server_port :3000,
    db_url : 'mongodb://localhost:27017/local',
    
    db_schemas : [
         {file:'./user_schema', collection:'users6', schemaName: 'userSchema',
        modelName:'userModel'}
        ,
        {file:'./post_schema', collection:'post', schemaName: 'postSchema',
        modelName:'postModel'}
        
    ],
    
    route_info : [
        {file:'./post', path:'/process/addpost/', method:'addpost', type: 'post'},
        {file:'./post', path:'/process/showpost/:id', method:'showpost', type: 'get'}
    ],
    
}
반응형

댓글