Web-Node.js/간단한 익명게시판 만들기
4. 서버 파일 만들기 (node.js)
초보개발자뀨
2021. 3. 24. 17:13
사용할 모듈.
- express
- bodyParser
- moment - 날짜 포맷을 위한 모듈
DB파일 만들기
db 파일은 /config/database.js 에 저장했습니다.
let mysql = require('mysql');
let db_info = {
host: '
port:'
user: '
password: '
database: '
connectionLimit:
};
module.exports.poll = function(){
return mysql.createPool(db_info);
};
db 인포 정보는 자신의 db 정보를 적어주시면 됩니다.
기존 poll방식 말고 creatConnection 방식을 사용했었는데 db정보를 수정해도 서버가 다운되는 현상이 발견되어 구글링 검색하여 mysql 환경설정 및 환경변수들을 조작하여도 해결이 안되어 좌절 하던 중 poll 방식을 사용하였더니 깔끔하게 해결되었습니다.
app.js : 서버연동 파일입니다(node.js)
- 우선 필요한 모듈을 불러오는 부분입니다.
const express = require('express');
const app = express();
const bodyParser = require('body-parser'); //bobyPaser : API 요청에서 받은 body 값을 파싱하는 역할을 수행하는 것을 불러온다,
const moment = require('moment'); // 날짜 포멧을 위한 모듈
const path = require('path');
const {addListener} = require('process');
const methodOverride = require('method-override');
const {createPool} = require('mysql');
const {render} = require('ejs');
const {json} = require('express');
const port = process.env.PORT || 3000; //process.env.PORT는 기본 포트로 heroku를 사용할 때 필요하다
let id; //추후 게시물 수정시 필요한 변수
----모듈 연결 부분
app.use(methodOverride('_method'));
app.use(express.static(path.join(__dirname, '/'))); //정적 파일을 쉽게 접근 할 수 있도록 경로를 바꿔준다. __dirname은 현재 폴더를 이야기 한다.
app.set('views', __dirname + '/views'); // views 파일들을 현재 폴더 밑에 있는 views라는 폴더안에 있는 것을 사용하겠다는 뜻
app.set('view engine', 'ejs'); // view engine 으로 ejs를 사용한다.
// body pasher
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false})); // 어플리케이션에 연결
- DB 연동 부분입니다.
//db 연동부분
const db_config = require(__dirname + '/config/database.js'); //config/database.js 에 저장해놓은 mysql 정보를 불러온다.
const poll = db_config.poll();
- 홈페이지 들어갔을 시 보여질 화면 입니다 본래 '/' 접속시 index파일이 있으면 index파일을 보여주지만 따로 만들지 않고 바로 /list로 재요청해주었습니다.
app.get('/', function (req, res) {
res.redirect('/list');
});
- /list로 접근시 수행할 코드입니다. 글들이 저장되어있는 board테이블에서 내용들을 가져와 그 결과를 list에 넣어 board.ejs로 render시켜주었습니다.
app.get('/list', function (req, res) {
poll.getConnection(function (err, conn) {
let sql = 'SELECT * FROM board';
conn.query(sql, function (err, rows, fields) {
//rows에 담긴다.
for (let i = 0; i < rows.length; i++) {
rows[i].date = moment(rows[i].date).format('YYYY-MM-DD'); //db에서 date 타입을 Date로 했기에 필요없는 부분은 날리려구 포멧해주어서 다시 넣어준다.
}
if (err)
console.log('query is not excuted. select fail...\n' + err);
else
res.render('board.ejs', {list: rows}); //오류가 안뜬다면 board.ejs 로 rows값들을 list에 넣어 보낸다
}
);
+conn.release();
});
});
- /write 로 접근시 수행할 코드입니다. board.ejs에서 글씨기 버튼을 누르면 /write에 접근하도록 했습니다.
app.get('/write', function (req, res) { // /write로 요청시 write.ejs로 이동한다.
res.render('write.ejs');
});
- wirte.ejs 에서 글 정보를 입력 후 글 작성 버튼을 누르면 post 방식으로 /writeAf로 접근시 수행할 코드입니다.
//insert 수행 부분
app.post('/writeAf', function (req, res) {
let body = req.body;
let sql = 'INSERT INTO board(writer,title,context,password,date) VALUES(?,?,?,?,curdate(' +
'))' ;
let params = [body.writer, body.title, body.context, body.password];
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.redirect('/list');
}
);
conn.release();
});
});
- /read/:number 접근시 수행할 코드입니다. 해당 글 클릭 시 글 레이아웃의 class값에 해당 글의 기본키인 id값을 넣어주어서 /read/해당글의 id값 으로 연결할 수 있도록 하였습니다. 또한 글 테이블의 id값은 댓글 테이블에서 외래키이므로 다중 sql를 실행하여 글과 댓글이 함께 보일 수 있도록 했습니다.
app.get('/read/:number', function (req, res) {
id = req.params.number;
let sql = 'select * from board where id=?; ';
let sql1 = 'select * from sboard where id=?; ';
// let sqls = mysql.format(sql,number); let sqls1 = mysql.format(sql1,number);
poll.getConnection(function (err, conn) {
conn.query(sql, id, function (err, rows) {
conn.query(sql1, id, function (err, rows1) {
if (err)
console.log('query is not excuted. select fail...\n' + err);
else {
res.render("read.ejs", {
list: rows,
sub_list: rows1
});
}
});
conn.release();
});
});
});
- read.ejs에서 삭제 버튼을 누를 시 작동 할 코드입니다.
app.get('/read/remove/:number', function (req, res) {
let number = req.params.number;
let sql = 'delete from board where id =?'
let params = number;
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.redirect('/list'); //오류 미 발생시 /list 돌아간다.
}
);
conn.release();
});
});
- read.ejs에서 수정 버튼을 누를 시 작동 할 코드입니다. 이동 시 화면에 본래 적혀 있던 정보들을 보여주고 수정 할수 있도록 하였습니다.
// 수정 버튼 눌렀을 시 원래 내용 띄워주기
app.get('/read/update/:number', function (req, res) {
let number = req.params.number;
let sql = 'select * from board where id =?'
let params = number;
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err, rows) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.render("update.ejs", {list: rows});
}
);
conn.release();
});
});
- update.ejs에서 수정 버튼을 누를 시 수행할 코드입니다.
// update 문 수행
app.post('/updateAf', function (req, res) {
let body = req.body;
let sql = 'UPDATE board set title=?,context=? where id =? '
let params = [body.title, body.context, body.id];
console.log(JSON.stringify(params));
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err) { // sql를 실행하고 VALUES 으로 params를 보낸다.
if (err)
console.log('query is not excuted. update fail...\n' + err);
else
res.redirect('/list'); //오류 미 발생시 /list 돌아간다.
}
);
conn.release();
});
});
이제 댓글 부분입니다.
- 댓글 입력시 수행할 코드입니다.
// 댓글 입력 시
app.post('/read/sub/insert', function (req, res) {
let body = req.body;
let sql = 'INSERT INTO sboard(id,swriter,scontext,spassword,sdate) VALUES(?,?,?,?,curdat' +
'e())';
let params = [id, body.sub_writer, body.sub_context, body.sub_password];
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.redirect('/read/' + id); //오류 미 발생시 /list 돌아간다.
}
);
conn.release();
});
});
- 댓글 수정 시 수행할 코드입니다.
// 댓글 수정 시
app.get('/read/sub/update/:sub_number', function (req, res) {
let sub_number = req.params.sub_number;
let sql = 'select * from sboard where sid =?'
poll.getConnection(function (err, conn) {
conn.query(sql, sub_number, function (err, rows) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.render("sub_update.ejs", {sub_list: rows});
}
);
conn.release();
});
});
- 댓글 수정창에서 수정을 누를 시 수행할 코드입니다.
app.post('/sub_updateAf', function (req, res) {
let body = req.body;
console.log("댓글 수정 실행");
let sql = 'UPDATE sboard set scontext=? where sid =? ';
let params = [body.sub_context, body.number];
poll.getConnection(function (err, conn) {
conn.query(sql, params, function (err) { // sql를 실행하고 VALUES 으로 params를 보낸다.
if (err)
console.log('query is not excuted. update fail...\n' + err);
else {
res.render('null.ejs');
console.log("업데이트 수행 완료")
}
}
);
conn.release();
});
});
- 댓글 삭제버튼을 누를 시 수행할 코드입니다.
app.get('/read/sub/remove/:number', function (req, res) {
let sub_id = req.params.number;
let sql = 'delete from sboard where sid =?'
console.log("특정 값 : " + sub_id);
poll.getConnection(function (err, conn) {
conn.query(sql, sub_id, function (err) {
if (err)
console.log('query is not excuted. insert fail...\n' + err);
else
res.redirect('/read/' + id); //오류 미 발생시 /list 돌아간다.
}
);
conn.release();
});
});
마지막으로 코드를 해당 포트로 응답할 코드입니다.
app.listen(port, () => console.log('Server is running on port 3000...')); //3000포트로 응답한다.
코드 상세 내용은 에서 확인 하실 수 있습니다.
github.com/park517/Web/tree/Example/Board
park517/Web
Contribute to park517/Web development by creating an account on GitHub.
github.com