everyday com-eat
작성일
2023. 12. 11. 22:28
작성자
갱수터
728x90

글 수정하기

수정 링크 생성

  •  update 는 글을 수정하는 기능이기 때문에 쿼리스트링으로 id값을 받았을때만 보여지게 하고 싶음
  • 홈 화면 = create만/ 페이지 화면 = create,update 둘다 / create 화면 = 자체 form태그 사용중 공백 삽입
  • update 할때 수정대상을 알려줘야 하기때문에 쿼리 스트링으로 id를 넘겨줘야함
/**
 * 본문 셋팅 함수
 */
function templateHTML(title, list, body, control) {
  return `
...생략...
      <body>
      <h1><a href="/">WEB</a></h1>
      ${list}
      ${control}
      ${body}
    </body>
...생략...
  `;
}


-----------------------------------------------------
//홈
var template =templateHTML(title, list,
          `<h2>${title}</h2><p>${description}</p>`,
          `<a href="/create">create</a>`);
          
//페이지
var template =templateHTML(title, list,
            `<h2>${title}</h2><p>${description}</p>`,
            `<a href="/create">create</a> <a href="/update?id=${title}">update</a>`);
            
            
 //create
 var template =templateHTML(title, list, `
        <form action="http://localhost:3000/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>
      `, '');

 

 

 

수정 화면 만들기

  • 수정 폼 필요함
  • 수정해야 할 데이터를 미리 넣어둬야 하기 때문에 파일읽기 기능이 필요함
  • 수정하는 정보(변경할 title)와 우리가 수정하고자 하는 정보(기존 title)를 구부내서 전송해야함
  • create 화면 블럭을 복사해서 수정
  • !_내가 readdir함수랑 readFile함수의 순서를 바꿔 썻더라...
  • !_form action 경로 절대경로 >>> 상대경로로 변경
else if(pathname === '/update') {    //update일 때 실행
    fs.readdir('./data',function(error, filelist) {
      fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
        var title = queryData.id;
        var list = templateList(filelist);
        var template =templateHTML(title, list,`
        <form action="http://localhost:3000/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.writeHead(200);
        response.end(template); 
      });
    });
  }

 

 

 

수정 처리 하기

  • 웹 페이지 제목 = 파일 이름 이므로, 첫번째로 파일 이름을 변경해야함 nodejs file rename
  • 그 후 내용 수정 하기
  • create_process 복사하여 수정
else if(pathname === '/update_process') {    //update_process일 때 실행
    var body = '';

    request.on('data', function(data) {
      body = body + data;
    });

    request.on('end', function(data) {
      var post = qs.parse(body);
      var id = post.id; //기존 title
      var title = post.title; //변경할 title
      var description = post.description;
      fs.rename(`data/${id}`,`data/${title}`, function(err){ 
        if(err)
          console.log(err);
        else {
          fs.writeFile(`data/${title}`, description, 'utf8', function(err){
            response.writeHead(302, {Location: `/?id=${title}`});
            response.end();
          });
        }
      });
      
    });
}

 

 

결과

 

 

 

 

 

 


 

 

글 삭제하기

삭제 버튼 만들기

  • 화면이 필요하지 않다 > 페이지 이동이 필요하지 않다 > 주소 노출 시(외부 유출시) 보안사고가 발생할 수 있다 
  • 즉 POST 방식으로 데이터를 넘겨줘야 한다(링크 x 폼O)
//페이지
var template =templateHTML(title, list,
            `<h2>${title}</h2><p>${description}</p>`,
            `<a href="/create">create</a>
            <a href="/update?id=${title}">update</a>
            <form action="/delete_process" method="POST">
               <input type="hidden" name="id" value="${title}" />
               <input type="submit" value="delete" />
             </form>`);

 

 

 

삭제 처리 하기

else if(pathname === '/delete_process') {    //delete_process일 때 실행
    var body = '';

    request.on('data', function(data) {
      body = body + data;
    });

    request.on('end', function(data) {
      var post = qs.parse(body);
      var id = post.id;
      fs.unlink(`data/${id}`, function(err){
        response.writeHead(302, {Location: `/`});
        response.end();
      });
    });   
  }

 

 

결과