반응형
스키마 정의하고 관련 함수 정의
스키마 메소드 추가 ( 저장, 댓글 추가, 댓글 삭제)
// 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'}
],
}
반응형
'IT > web' 카테고리의 다른 글
Node.js] 게시판 만들기3 // 글 삭제 기능 (0) | 2020.02.13 |
---|---|
Node.js] 게시판 만들기2 // 글 리스트 보기, 조회수 조회 (0) | 2020.02.12 |
Node.js] 구글 패스포트로 사용자 인증 (0) | 2020.02.10 |
Node.js] 플래쉬 메시지 (0) | 2020.02.08 |
Node.js] 라우팅 개념 다시 한번 (0) | 2020.02.08 |
댓글