JavaScript/Node.js

CRUD 게시판 만들기 [Node.js express]

충 민 2022. 9. 20. 20:12

팀 스터디로 무엇을 할지 고민하다가 팀원 모두가 Node.js에 관심을 가지고 있어 Node.js로 정하였다.

수업시간에 js와 jsp를 듣고있어 원활하게 진행되나 싶었지만 역시 착각이었다.

세팅부터 정말 애를 먹었다.(왜 내가하면 잘 안되는걸까...?)

정말 신기...ㅋㅋㅋㅋㅋㅋ

 

하지만 고비끝에 생활코딩 영상을 보면서 세팅을 완료했다.(세팅만 장난안치고 하루걸림....)

어쨋든 시작이 느린만큼 밤을 새면서 공부를 했다. 

 

https://github.com/web-n/Nodejs

 

GitHub - web-n/Nodejs

Contribute to web-n/Nodejs development by creating an account on GitHub.

github.com

이 파일들을 다운로드 한 후 진행하면 된다.

차근차근 밑에 영상들을 다 보면 express에 대한 이해가 될 것이다.

https://opentutorials.org/course/3370/21378

 

실습환경 준비 - 생활코딩

수업소개 Node.js 웹 프래임워크인 Express 수업을 시작하겠습니다. 이를 위해서는 실습환경이 필요합니다. 여기서는 실습환경을 구성하는 방법에 대해서 알려드립니다. 강의 참고 WEB2 - Node.js 수업

opentutorials.org

우선 결과부터 보여주겠다. 

main.js에서 터미널 창을 킨 후

"pm2 start main.js --watch" 를 입력하고 미리지정한 경로인 localhost:3000에 접속한다. 

 

그러면 다음과 같은 페이지가 나온다. 

 create를 클릭하면

이렇게 입력 후 제출버튼을 클릭하면

리스트 생성이 된다. 

두개의 리스트를 추가해보았다. 

안녕을 클릭하고 update를 누르면 

기존에 작성해 놓았던 데이터가 나오게된다. 

안녕3을 입력하고 제출버튼은 눌러보겠다.

이렇게 수정이 잘되는 것을 확인할 수 있다. 마지막 기능인 delete는 

안녕 3을 클릭 후 delete 버튼을 눌러서 

모든 CRUD기능이 되는 것을 확인할 수 있다. 

 

Main.js

var express = require('express') //const 상수 바뀌지않음 ex) final  
var app = express()//함수
var fs = require('fs');
var template = require('./lib/template.js');
var path = require('path');
var sanitizeHtml = require('sanitize-html');
var qs = require('querystring');
var bodyParser = require('body-parser');
const compression = require('compression');
//사진
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));//미들웨어 실행이됨
//내부적으로 분석해서 모든데이터를 가져온다음에 콜백을 호출하기로 약속되어있음 호출하면서
//request라고 정의한 파라미터 변수에 body라는 프로퍼티를 만들어줌 bodyparser라는 미들웨어가.

//-----남이만든 미들웨어 사용하기 ㅋㅋ -----
app.use(compression());
//미들웨어를 리턴하기로 약속하여서 use로 요청이들어올때마다 실행

//-----이건 내가 만든 미들웨어 ㅋㅋ -----
app.get('*',function(request,response,next){  //next엔 그다음에 호출되어야할 미들웨어가 담겨있다.
  //get방식만 파일목록을 가져옴
  fs.readdir('./data', function(error, filelist){
    request.list = filelist;
    next();
  });
})

//express는 모든게 미들웨어처럼 느낌 fuction이라는 함수가 다 미들웨어 


//route, routing - get 여러가지 path로 들어올떄 path마다 응답 
//app.get('/', (req, res) => {res.send('Hello World!')}) 아래코드와 동일

app.get('/', function (request, response) { //route를 써서 request 와 response를 따로가져올수있었다.
  //fs.readdir('./data', function(error, filelist){ //data 파일에서 가져옴
              var title = 'Welcome';
              var description = 'Hello, Node.js';
              var list = template.list(request.list);
              var html = template.HTML(title, list,
                `<h2>${title}</h2>${description}
                <img src="/images/hello.jpg" style="width:100px; display:block; margin:10px;">`,//정적파일 서비스(사진 넣기)
                `<a href="/create">create</a>`
              );
              response.send(html);
           // });
})

app.get('/page/:pageId', function (request, response,next) {
  console.log(request.list);
  //fs.readdir('./data', function(error, filelist){ //글 목록 표현기능 
               var filteredId = path.parse(request.params.pageId).base;
              fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
                if(err){
                  next(err);
                }else{
                var title =request.params.pageId;
                var sanitizedTitle = sanitizeHtml(title);
                var sanitizedDescription = sanitizeHtml(description, {
                  allowedTags:['h1']
                });
                var list = template.list(request.list);
                var html = template.HTML(sanitizedTitle, list,
                  `<h2>${sanitizedTitle}</h2>${sanitizedDescription}`,
                  ` <a href="/create">create</a>
                    <a href="/update/${sanitizedTitle}">update</a>
                    <form action="/delete_process" method="post">
                      <input type="hidden" name="id" value="${sanitizedTitle}">
                      <input type="submit" value="delete">
                    </form>`
                );
                response.send(html);}
              });
            //});
          }
)

app.get('/create',function(request,response){
 // fs.readdir('./data', function(error, filelist){
            var title = 'WEB - create';
            var list = template.list(request.list);
            var html = template.HTML(title, list, `
              <form action="/create_process" method="post">
                <p><input type="text" name="title" placeholder="title"></p>
                <p>
                  <textarea name="description" placeholder="description"></textarea>
                </p>
                <p>
                  <input type="submit">
                </p>
              </form>
            `, '');
            response.send(html);
        //  });
})

app.post('/create_process',function(request,response){
  /* 익스프레스 코드
  var body = '';
        request.on('data', function(data){
            body = body + data;
        });
        request.on('end', function(){
            var post = qs.parse(body);
            var title = post.title;
            var description = post.description;
            fs.writeFile(`data/${title}`, description, 'utf8', function(err){
              response.writeHead(302, {Location: `/?id=${title}`});
              response.end();
            })
        });
        */

        var post = request.body;
            var title = post.title;
            var description = post.description;
            fs.writeFile(`data/${title}`, description, 'utf8', function(err){
              response.writeHead(302, {Location: `/?id=${title}`});
              response.end();
            })
})


app.get('/update/:pageId',function(request,response){
 // fs.readdir('./data', function(error, filelist){
            var filteredId = path.parse(request.params.pageId).base;
            fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
              var title = request.params.pageId;
              var list = template.list(request.list);
              var html = template.HTML(title, list,
                `
                <form action="/update_process" method="post">
                  <input type="hidden" name="id" value="${title}">
                  <p><input type="text" name="title" placeholder="title" value="${title}"></p>
                  <p>
                    <textarea name="description" placeholder="description">${description}</textarea>
                  </p>
                  <p>
                    <input type="submit">
                  </p>
                </form>
                `,
                `<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
              );
              response.send(html);
            });
         // });
});

app.post('/update_process',function(request,response){
  /* 익스프레스 코드
  var body = '';
        request.on('data', function(data){
            body = body + data;
        });
        request.on('end', function(){
            var post = qs.parse(body);
            var id = post.id;
            var title = post.title;
            var description = post.description;
            fs.rename(`data/${id}`, `data/${title}`, function(error){
              fs.writeFile(`data/${title}`, description, 'utf8', function(err){
                response.redirect('/?id=${title}');
              })
            });
        });*/
        var post = request.body;
        var id = post.id;
        var title = post.title;
        var description = post.description;
        fs.rename(`data/${id}`, `data/${title}`, function(error){
          fs.writeFile(`data/${title}`, description, 'utf8', function(err){
            response.redirect('/?id=${title}');
          })
        });

})
app.post('/delete_process',function(request,response){
  /* 익스프레스 코드
  var body = '';
        request.on('data', function(data){
            body = body + data;
        });
        request.on('end', function(){
            var post = qs.parse(body);
            var id = post.id;
            var filteredId = path.parse(id).base;
            fs.unlink(`data/${filteredId}`, function(error){
              response.redirect('/');
            })
        });*/

        var post = request.body;
            var id = post.id;
            var filteredId = path.parse(id).base;
            fs.unlink(`data/${filteredId}`, function(error){
              response.redirect('/');
            })

})

//=======에러처리======= 에러처리는 마지막에! 순차적으로 처리할라고~
app.use(function(req,res,next){
  res.status(404).send('Sorry cant find that!');
})
app.use(function(err,req,res,next){
  res.status(500).send('Something break!');
})
app.listen(3000, function() {
  console.log(`Example app listening on port 3000`)
})

 

 

다음글에서는 라우터를 이용하여

css까지 입혀보겠다...

파이팅 오늘도 밤새야지