min1925k@gmail.com

Board List

......@@ -12,6 +12,9 @@ var lpgRouter = require('./routes/lpg')
var weatherRouter = require('./routes/weather')
var menuRouter = require('./routes/menu')
var csvRouter = require('./routes/csv')
var postRouter = require('./routes/post')
var postaddRouter = require('./routes/postadd')
var app = express();
var router = express.Router();
......@@ -49,6 +52,8 @@ app.use('/login',loginRouter); // login page route
app.use('/weather',weatherRouter)
app.use('/lpg',lpgRouter)
app.use('/signup',signupRouter); // sign up page route
app.use('/post',postRouter);
app.use('/postadd',postaddRouter);
app.use('/', indexRouter); // main page route
......
......@@ -2,6 +2,8 @@ module.exports = {
server_port: 3000,
db_url: 'mongodb://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites=true&w=majority',
db_schemas: [
{file:'./user_schema', collection:'users3', schemaName:'UserSchema', modelName:'UserModel'}
{file:'./user_schema', collection:'users', schemaName:'UserSchema', modelName:'UserModel'},
{file:'./post_schema.js', collection:'post', schemaName:'PostSchema', modelName:'PostModel'}
]
}
\ No newline at end of file
......
......@@ -4,16 +4,12 @@ var db_url = 'mongodb+srv://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites
var database = {};
// 초기화를 위해 호출하는 함수
database.init = function(app, config) {
console.log('init() 호출됨.');
database.init = function(app, config) {
connect(app, config);
}
//데이터베이스에 연결하고 응답 객체의 속성으로 db 객체 추가
function connect(app, config) {
console.log('connect() 호출됨.');
function connect(app, config) {
// 데이터베이스 연결 : config의 설정 사용
mongoose.Promise = global.Promise; // mongoose의 Promise 객체는 global의 Promise 객체 사용하도록 함
mongoose.connect(db_url);
......@@ -35,27 +31,22 @@ function connect(app, config) {
// config에 정의된 스키마 및 모델 객체 생성
function createSchema(app, config) {
var schemaLen = config.db_schemas.length;
console.log('설정에 정의된 스키마의 수 : %d', schemaLen);
for (var i = 0; i < schemaLen; i++) {
var curItem = config.db_schemas[i];
// 모듈 파일에서 모듈 불러온 후 createSchema() 함수 호출하기
var curSchema = require(curItem.file).createSchema(mongoose);
console.log('%s 모듈을 불러들인 후 스키마 정의함.', curItem.file);
// User 모델 정의
var curModel = mongoose.model(curItem.collection, curSchema);
console.log('%s 컬렉션을 위해 모델 정의함.', curItem.collection);
// database 객체에 속성으로 추가
database[curItem.schemaName] = curSchema;
database[curItem.modelName] = curModel;
console.log('스키마 이름 [%s], 모델 이름 [%s] 이 database 객체의 속성으로 추가됨.', curItem.schemaName, curItem.modelName);
}
app.set('database', database);
console.log('database 객체가 app 객체의 속성으로 추가됨.');
}
......
var SchemaObj = {};
SchemaObj.createSchema = function(mongoose) {
// 글 스키마 정의
var PostSchema = mongoose.Schema({
title: {type: String, trim: true, 'default':''}, // 글 제목
contents: {type: String, trim:true, 'default':''}, // 글 내용
writer: {type: mongoose.Schema.ObjectId, ref: 'users'}, // 글쓴 사람
comments: [{ // 댓글
contents: {type: String, trim:true, 'default': ''}, // 댓글 내용
writer: {type: mongoose.Schema.ObjectId, ref: 'users'},
created_at: {type: Date, 'default': Date.now}
}],
tags: {type: [], 'default': ''},
created_at: {type: Date, index: {unique: false}, 'default': Date.now},
updated_at: {type: Date, index: {unique: false}, 'default': Date.now}
});
// 필수 속성에 대한 'required' validation
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({
contents: comment.contents,
writer: user._id
});
this.save(callback);
},
removeComment: function(id, callback) { // 댓글 삭제
var index = utils.indexOf(this.comments, {id: id});
if (~index) {
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);
}
}
return PostSchema;
};
// module.exports에 PostSchema 객체 직접 할당
module.exports = SchemaObj;
/**
* 배열 객체 안의 배열 요소가 가지는 인덱스 값 리턴
*/
function indexOf(arr, obj) {
var index = -1;
var keys = Object.keys(obj);
var result = arr.filter(function (doc, idx) {
var matched = 0;
for (var i = keys.length - 1; i >= 0; i--) {
if (doc[keys[i]] === obj[keys[i]]) {
matched++;
if (matched === keys.length) {
index = idx;
return idx;
}
}
}
});
return index;
}
/**
* 배열 안의 요소 중에서 파라미터와 같은 객체를 리턴
*/
function findByParam(arr, obj, callback) {
var index = exports.indexof(arr, obj)
if (~index && typeof callback === 'function') {
return callback(undefined, arr[index])
} else if (~index && !callback) {
return arr[index]
} else if (!~index && typeof callback === 'function') {
return callback('not found')
}
}
\ No newline at end of file
......@@ -10,7 +10,7 @@ Schema.createSchema = function(mongoose) {
hashed_password: {type: String, required: true, 'default':''},
salt: {type:String, required:true},
name: {type: String, index: 'hashed', 'default':''},
age: {type: Number, 'default': -1},
email: {type: Number, 'default': ''},
created_at: {type: Date, index: {unique: false}, 'default': Date.now},
updated_at: {type: Date, index: {unique: false}, 'default': Date.now}
});
......@@ -91,8 +91,6 @@ Schema.createSchema = function(mongoose) {
return this.find({}, callback);
});
console.log('UserSchema 정의함.');
return UserSchema;
};
......
var express = require('express')
var router = express.Router()
var Entities = require('html-entities').AllHtmlEntities;
router.get('/',function(req,res){
var paramPage = 0;
var paramPerPage = 10;
var database = req.app.get('database');
// 데이터베이스 객체가 초기화된 경우
if (database.db) {
// 1. 글 리스트
var options = {
page: paramPage,
perPage: paramPerPage
}
database.PostModel.list(options, function(err, results) {
if (err) {
console.error('게시판 글 목록 조회 중 에러 발생 : ' + err.stack);
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h2>게시판 글 목록 조회 중 에러 발생</h2>');
res.write('<p>' + err.stack + '</p>');
res.end();
return;
}
if (results) {
console.dir(results);
// 전체 문서 객체 수 확인
database.PostModel.count().exec(function(err, count) {
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// 뷰 템플레이트를 이용하여 렌더링한 후 전송
var context = {
title: '글 목록',
posts: results,
page: parseInt(paramPage),
pageCount: Math.ceil(count / paramPerPage),
perPage: paramPerPage,
totalRecords: count,
size: paramPerPage
};
req.app.render('post', context, function(err, html) {
if (err) {
console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
res.write('<p>' + err.stack + '</p>');
res.end();
return;
}
res.end(html);
});
});
} else {
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h2>글 목록 조회 실패</h2>');
res.end();
}
});
} else {
res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
res.write('<h2>데이터베이스 연결 실패</h2>');
res.end();
}
})
module.exports = router;
// var addpost = function(req, res) {
// console.log('post 모듈 안에 있는 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('요청 파라미터 : ' + paramTitle + ', ' + paramContents + ', ' +
// paramWriter);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 아이디를 이용해 사용자 검색
// database.UserModel.findByEmail(paramWriter, function(err, results) {
// if (err) {
// console.error('게시판 글 추가 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 추가 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// 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);
// // save()로 저장
// // PostModel 인스턴스 생성
// var post = new database.PostModel({
// title: paramTitle,
// contents: paramContents,
// writer: userObjectId
// });
// post.savePost(function(err, result) {
// if (err) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// }
// 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 listpost = function(req, res) {
// console.log('post 모듈 안에 있는 listpost 호출됨.');
// var paramPage = req.body.page || req.query.page;
// var paramPerPage = req.body.perPage || req.query.perPage;
// console.log('요청 파라미터 : ' + paramPage + ', ' + paramPerPage);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 글 리스트
// var options = {
// page: paramPage,
// perPage: paramPerPage
// }
// database.PostModel.list(options, function(err, results) {
// if (err) {
// console.error('게시판 글 목록 조회 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 목록 조회 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// if (results) {
// console.dir(results);
// // 전체 문서 객체 수 확인
// database.PostModel.count().exec(function(err, count) {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// // 뷰 템플레이트를 이용하여 렌더링한 후 전송
// var context = {
// title: '글 목록',
// posts: results,
// page: parseInt(paramPage),
// pageCount: Math.ceil(count / paramPerPage),
// perPage: paramPerPage,
// totalRecords: count,
// size: paramPerPage
// };
// req.app.render('listpost', context, function(err, html) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// res.end(html);
// });
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>글 목록 조회 실패</h2>');
// res.end();
// }
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>데이터베이스 연결 실패</h2>');
// res.end();
// }
// };
// var showpost = function(req, res) {
// console.log('post 모듈 안에 있는 showpost 호출됨.');
// // URL 파라미터로 전달됨
// var paramId = req.body.id || req.query.id || req.params.id;
// console.log('요청 파라미터 : ' + paramId);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 글 리스트
// database.PostModel.load(paramId, function(err, results) {
// if (err) {
// console.error('게시판 글 조회 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 조회 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// if (results) {
// console.dir(results);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// // 뷰 템플레이트를 이용하여 렌더링한 후 전송
// var context = {
// title: '글 조회 ',
// posts: results,
// Entities: Entities
// };
// req.app.render('showpost', context, function(err, html) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// console.log('응답 웹문서 : ' + html);
// res.end(html);
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>글 조회 실패</h2>');
// res.end();
// }
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>데이터베이스 연결 실패</h2>');
// res.end();
// }
// };
// module.exports.listpost = listpost;
// module.exports.addpost = addpost;
// module.exports.showpost = showpost;
\ No newline at end of file
var express = require('express')
var router = express.Router()
var Entities = require('html-entities').AllHtmlEntities;
router.get('/',function(req,res){
res.render('postadd.ejs');
})
module.exports = router;
// var addpost = function(req, res) {
// console.log('post 모듈 안에 있는 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('요청 파라미터 : ' + paramTitle + ', ' + paramContents + ', ' +
// paramWriter);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 아이디를 이용해 사용자 검색
// database.UserModel.findByEmail(paramWriter, function(err, results) {
// if (err) {
// console.error('게시판 글 추가 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 추가 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// 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);
// // save()로 저장
// // PostModel 인스턴스 생성
// var post = new database.PostModel({
// title: paramTitle,
// contents: paramContents,
// writer: userObjectId
// });
// post.savePost(function(err, result) {
// if (err) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// }
// 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 listpost = function(req, res) {
// console.log('post 모듈 안에 있는 listpost 호출됨.');
// var paramPage = req.body.page || req.query.page;
// var paramPerPage = req.body.perPage || req.query.perPage;
// console.log('요청 파라미터 : ' + paramPage + ', ' + paramPerPage);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 글 리스트
// var options = {
// page: paramPage,
// perPage: paramPerPage
// }
// database.PostModel.list(options, function(err, results) {
// if (err) {
// console.error('게시판 글 목록 조회 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 목록 조회 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// if (results) {
// console.dir(results);
// // 전체 문서 객체 수 확인
// database.PostModel.count().exec(function(err, count) {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// // 뷰 템플레이트를 이용하여 렌더링한 후 전송
// var context = {
// title: '글 목록',
// posts: results,
// page: parseInt(paramPage),
// pageCount: Math.ceil(count / paramPerPage),
// perPage: paramPerPage,
// totalRecords: count,
// size: paramPerPage
// };
// req.app.render('listpost', context, function(err, html) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// res.end(html);
// });
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>글 목록 조회 실패</h2>');
// res.end();
// }
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>데이터베이스 연결 실패</h2>');
// res.end();
// }
// };
// var showpost = function(req, res) {
// console.log('post 모듈 안에 있는 showpost 호출됨.');
// // URL 파라미터로 전달됨
// var paramId = req.body.id || req.query.id || req.params.id;
// console.log('요청 파라미터 : ' + paramId);
// var database = req.app.get('database');
// // 데이터베이스 객체가 초기화된 경우
// if (database.db) {
// // 1. 글 리스트
// database.PostModel.load(paramId, function(err, results) {
// if (err) {
// console.error('게시판 글 조회 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>게시판 글 조회 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// if (results) {
// console.dir(results);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// // 뷰 템플레이트를 이용하여 렌더링한 후 전송
// var context = {
// title: '글 조회 ',
// posts: results,
// Entities: Entities
// };
// req.app.render('showpost', context, function(err, html) {
// if (err) {
// console.error('응답 웹문서 생성 중 에러 발생 : ' + err.stack);
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>응답 웹문서 생성 중 에러 발생</h2>');
// res.write('<p>' + err.stack + '</p>');
// res.end();
// return;
// }
// console.log('응답 웹문서 : ' + html);
// res.end(html);
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>글 조회 실패</h2>');
// res.end();
// }
// });
// } else {
// res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
// res.write('<h2>데이터베이스 연결 실패</h2>');
// res.end();
// }
// };
// module.exports.listpost = listpost;
// module.exports.addpost = addpost;
// module.exports.showpost = showpost;
\ No newline at end of file
......@@ -9,14 +9,14 @@ router.get('/',function(req,res){
router.post('/process', function(req, res) {
console.log('/signup/process 처리함');
var paramName = req.body.name || req.query.name;
var paramEmail = req.body.email || req.query.email;
var paramId = req.body.id || req.query.id;
var paramPassword = req.body.password || req.query.password;
//GET, POST 모두 고려해서 둘 다 검사
res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });
res.write('<h1>Result form Express Server</h1>');
res.write('<div><p>Param name : ' + paramName + '</p></div>');
res.write('<div><p>Param E-mail : ' + paramEmail + '</p></div>');
res.write('<div><p>Param id : ' + paramId + '</p></div>');
res.write('<div><p>Param password : ' + paramPassword + '</p></div>');
res.write("<br><br><a href ='/login.html'>로그인 페이지로 돌아가기</a>");
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<title>Modern Business - Start Bootstrap Template</title>
<!-- Favicon-->
<link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
<!-- Bootstrap icons-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<!-- Core theme CSS (includes Bootstrap)-->
<link href="css/styles.css" rel="stylesheet" />
<script src="http://code.jquery.com/jquery-2.1.4.js"></script>
</head>
<body class="d-flex flex-column h-100">
<main class="flex-shrink-0">
<!-- Navigation-->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container px-5">
<a class="navbar-brand" href="/">휴게소 정보</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation"><span
class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item"><a class="nav-link" href="/menu">휴게소 메뉴</a></li>
<li class="nav-item"><a class="nav-link" href="/weather">날씨</a></li>
<li class="nav-item"><a class="nav-link" href="/lpg">LPG</a></li>
<li class="nav-item"><a class="nav-link" href="faq.html">FAQ</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownBlog" href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">Blog</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownBlog">
<li><a class="dropdown-item" href="blog-home.html">Blog Home</a></li>
<li><a class="dropdown-item" href="blog-post.html">Blog Post</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownLogin" href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">Login</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownLogin">
<li><a class="dropdown-item" href="/login">Login</a></li>
<li><a class="dropdown-item" href="/signup">Sign-up</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Page Content-->
<div class="container">
<br>
<div class="ui raised segment">
<a class="ui blue ribbon label">게시판</a>
<div class="ui blue fluid card">
<div class="content">
<table border="1" width="800" align="center">
<tr align="center">
<p>
<td colspan="3">게시판</td>
</p>
</tr>
<tr align="center">
<td>번호</td>
<td>제목</td>
<td>작성자</td>
<td>작성일</td>
</tr>
<div class="ui very relaxed selection celled list">
<% var noStart = 4; for(var i=0; i < posts.length; i++){ var curTitle=posts[i]._doc.title;
var curNo=noStart - i; var createdDate = posts[i]._doc.created_at; %>
<tr align="center">
<td>
<%= curNo %>
</td>
<td>
<%= curTitle %>
</td>
<td>admin</td>
<td><%=createdDate%></td>
</tr>
<% } %>
</div>
</table>
<br><br>
<a class="ui button" href='/postadd'>글쓰기</a>
</div>
</div>
</div>
</div>
</main>
<!-- Footer-->
<footer class="bg-dark py-4 mt-auto">
<div class="container px-5">
<div class="row align-items-center justify-content-between flex-column flex-sm-row">
<div class="col-auto">
<div class="small m-0 text-white">Copyright &copy; Your Website 2022</div>
</div>
<div class="col-auto">
<a class="link-light small" href="#!">Privacy</a>
<span class="text-white mx-1">&middot;</span>
<a class="link-light small" href="#!">Terms</a>
<span class="text-white mx-1">&middot;</span>
<a class="link-light small" href="#!">Contact</a>
</div>
</div>
</div>
</footer>
<!-- Bootstrap core JS-->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Core theme JS-->
<script src="js/scripts.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="" />
<meta name="author" content="" />
<title>Modern Business - Start Bootstrap Template</title>
<!-- Favicon-->
<link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
<!-- Bootstrap icons-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<!-- Core theme CSS (includes Bootstrap)-->
<link href="css/styles.css" rel="stylesheet" />
<script src="http://code.jquery.com/jquery-2.1.4.js"></script>
</head>
<body class="d-flex flex-column h-100">
<main class="flex-shrink-0">
<!-- Navigation-->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container px-5">
<a class="navbar-brand" href="/">휴게소 정보</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation"><span
class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item"><a class="nav-link" href="/menu">휴게소 메뉴</a></li>
<li class="nav-item"><a class="nav-link" href="/weather">날씨</a></li>
<li class="nav-item"><a class="nav-link" href="/lpg">LPG</a></li>
<li class="nav-item"><a class="nav-link" href="faq.html">FAQ</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownBlog" href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">Blog</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownBlog">
<li><a class="dropdown-item" href="blog-home.html">Blog Home</a></li>
<li><a class="dropdown-item" href="blog-post.html">Blog Post</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="navbarDropdownLogin" href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">Login</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownLogin">
<li><a class="dropdown-item" href="/login">Login</a></li>
<li><a class="dropdown-item" href="/signup">Sign-up</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Page Content-->
<div class="container">
<br>
<div class="ui raised segment">
<a class="ui blue ribbon label">게시판</a>
<div class="ui blue fluid card">
<div class="content">
<br><br>
<a class="ui button" href='/postadd'>글쓰기</a>
</div>
</div>
</div>
</div>
</main>
<!-- Footer-->
<footer class="bg-dark py-4 mt-auto">
<div class="container px-5">
<div class="row align-items-center justify-content-between flex-column flex-sm-row">
<div class="col-auto">
<div class="small m-0 text-white">Copyright &copy; Your Website 2022</div>
</div>
<div class="col-auto">
<a class="link-light small" href="#!">Privacy</a>
<span class="text-white mx-1">&middot;</span>
<a class="link-light small" href="#!">Terms</a>
<span class="text-white mx-1">&middot;</span>
<a class="link-light small" href="#!">Contact</a>
</div>
</div>
</div>
</footer>
<!-- Bootstrap core JS-->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Core theme JS-->
<script src="js/scripts.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -58,8 +58,8 @@
<form method="post" action="/signup/process">
<table>
<tr>
<td><label>이름</label></td>
<td><input type="text" name="name"></td>
<td><label>E-mail</label></td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td><label>아이디</label></td>
......
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../ejs/bin/cli.js" "$@"
else
exec node "$basedir/../ejs/bin/cli.js" "$@"
fi
../ejs/bin/cli.js
\ No newline at end of file
......
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../jake/bin/cli.js" "$@"
else
exec node "$basedir/../jake/bin/cli.js" "$@"
fi
../jake/bin/cli.js
\ No newline at end of file
......
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../mime/cli.js" "$@"
else
exec node "$basedir/../mime/cli.js" "$@"
fi
../mime/cli.js
\ No newline at end of file
......
......@@ -337,9 +337,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/ejs": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz",
"integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==",
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
"integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
"dependencies": {
"jake": "^10.8.5"
},
......@@ -554,6 +554,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/html-entities": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
},
"node_modules/http": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
......
......@@ -55,6 +55,9 @@ for all the passed options. However, be aware that your code could break if we
add an option with the same name as one of your data object's properties.
Therefore, we do not recommend using this shortcut.
### Important
You should never give end-users unfettered access to the EJS render method, If you do so you are using EJS in an inherently un-secure way.
### Options
- `cache` Compiled functions are cached, requires `filename`
......
......@@ -979,6 +979,8 @@ if (typeof window != 'undefined') {
'use strict';
var regExpChars = /[|\\{}()[\]^$+*?.]/g;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var hasOwn = function (obj, key) { return hasOwnProperty.apply(obj, [key]); };
/**
* Escape characters reserved in regular expressions.
......@@ -1070,6 +1072,12 @@ exports.shallowCopy = function (to, from) {
from = from || {};
if ((to !== null) && (to !== undefined)) {
for (var p in from) {
if (!hasOwn(from, p)) {
continue;
}
if (p === '__proto__' || p === 'constructor') {
continue;
}
to[p] = from[p];
}
}
......@@ -1095,6 +1103,12 @@ exports.shallowCopyFromList = function (to, from, list) {
for (var i = 0; i < list.length; i++) {
var p = list[i];
if (typeof from[p] != 'undefined') {
if (!hasOwn(from, p)) {
continue;
}
if (p === '__proto__' || p === 'constructor') {
continue;
}
to[p] = from[p];
}
}
......@@ -1667,7 +1681,7 @@ module.exports={
"engine",
"ejs"
],
"version": "3.1.6",
"version": "3.1.7",
"author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
"license": "Apache-2.0",
"bin": {
......
This diff is collapsed. Click to expand it.
......@@ -25,6 +25,8 @@
'use strict';
var regExpChars = /[|\\{}()[\]^$+*?.]/g;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var hasOwn = function (obj, key) { return hasOwnProperty.apply(obj, [key]); };
/**
* Escape characters reserved in regular expressions.
......@@ -116,6 +118,12 @@ exports.shallowCopy = function (to, from) {
from = from || {};
if ((to !== null) && (to !== undefined)) {
for (var p in from) {
if (!hasOwn(from, p)) {
continue;
}
if (p === '__proto__' || p === 'constructor') {
continue;
}
to[p] = from[p];
}
}
......@@ -141,6 +149,12 @@ exports.shallowCopyFromList = function (to, from, list) {
for (var i = 0; i < list.length; i++) {
var p = list[i];
if (typeof from[p] != 'undefined') {
if (!hasOwn(from, p)) {
continue;
}
if (p === '__proto__' || p === 'constructor') {
continue;
}
to[p] = from[p];
}
}
......
......@@ -6,7 +6,7 @@
"engine",
"ejs"
],
"version": "3.1.7",
"version": "3.1.8",
"author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
"license": "Apache-2.0",
"bin": {
......
......@@ -13,10 +13,11 @@
"bootstrap": "^5.1.3",
"cookie-parser": "^1.4.6",
"crypto": "^1.0.1",
"ejs": "^3.1.7",
"ejs": "^3.1.8",
"express": "^4.18.1",
"express-error-handler": "^1.1.0",
"express-session": "^1.17.3",
"html-entities": "^2.3.3",
"http": "^0.0.1-security",
"mongoose": "^6.3.4",
"mysql": "^2.18.1",
......@@ -357,9 +358,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/ejs": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz",
"integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==",
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
"integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
"dependencies": {
"jake": "^10.8.5"
},
......@@ -574,6 +575,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/html-entities": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
},
"node_modules/http": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
......@@ -1526,9 +1532,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"ejs": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz",
"integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==",
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
"integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
"requires": {
"jake": "^10.8.5"
}
......@@ -1699,6 +1705,11 @@
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"html-entities": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
},
"http": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
......
......@@ -13,10 +13,11 @@
"bootstrap": "^5.1.3",
"cookie-parser": "^1.4.6",
"crypto": "^1.0.1",
"ejs": "^3.1.7",
"ejs": "^3.1.8",
"express": "^4.18.1",
"express-error-handler": "^1.1.0",
"express-session": "^1.17.3",
"html-entities": "^2.3.3",
"http": "^0.0.1-security",
"mongoose": "^6.3.4",
"mysql": "^2.18.1",
......