본문 바로가기

Web-Node.js/간단한 익명게시판 만들기

4. 서버 파일 만들기 (node.js)

사용할 모듈.

  • 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