ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ajax로 삭제요청
    Node.js,MongoDB 2022. 4. 6. 02:31

    삭제를 할 때 DELETE요청을 하면 된다. form태그의 method="post"를 delete로 바꾸면 되지 않을까 생각할 수 있지만, html상에서 delete요청을 할 순 없다. 

    그래서, 2가지 방법이 있다.

    1. method-override라이브러리를 사용하거나

    2. js ajax를 이용하거나

    2번을 이용해서 delete를 해보자.

     

    Ajax의 가장 큰 장점은 새로고침 없이 서버에 요청하는걸 도와준다.

    <h4 class="ml-2 my-3">서버에서 가져온 할일 리스트</h4>
    
        <ul class="list-group">
          <% for (var i = 0; i < posts.length; i++) { %>
            <li class="list-group-item">
              <h4>할일 제목 : <%= posts[i].제목 %></h4>
              <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
              <button class="btn btn-primary">삭제</button>
            </li>
          <% } %>
        </ul>

    먼저, list를 이쁘게 만들어주고

    $.ajax({
            method : 'DELETE',
            url : '요청할경로',
            data : '요청과 함께 보낼 데이터'
    })

    제이쿼리cdn을 먼저 써주고, 아래에 script태그를 만들어 위처럼 입력해준다.

    "서버에 새로고침없이 요청할 경로로 데이터를 가지고 DELETE요청을 할거에요"라는 뜻이다.

    $.ajax({
            method : 'DELETE',
            url : '/delete',
            data : '게시물번호'
          }).done(function(결과){
    
    })

    data에 게시물번호를 적어주면 게시물번호를 함께 보낸단 뜻이고,

    server.js에

    app.delete('/delete', function(요청,응답){
        console.log(요청.body);
    })

    이렇게, /delete로 접속하면, 콜백함수를 달아주고 요청.body를 적어주면 위의 게시물번호가 찾아진다.

    $.ajax({
            method : 'DELETE',
            url : '/delete',
            data : {_id : 1}
          }).done(function(결과){
    
          })
    app.delete('/delete', function(요청,응답){
        console.log(요청.body);
        //우리가 보낸 id는 문자로 나오고 mongoDB의 id는 숫자이기 때문에 변환과정 필요
        요청.body._id = parseInt(요청.body._id);
        //요청.body에 담긴 게시물번호에 따라 DB에서 게시물삭제
        db.collection('post').deleteOne(요청.body, function(에러, 결과){//삭제해주는 함수
            console.log('삭제완료');
        })
    })

    data로 _id를 보내주고, app.delete를 이용해 /delete로 접속하면 자료형을 숫자로 맞춰주고 deleteOne함수를 이용해서 요청.body(_id : 1)을 지워주게 된다.

     

    ajax로 써주면 새로고침할 때마다 계속 실행하므로 삭제라는 버튼을 만들어서

    $('.delete').click(function() {
              $.ajax({
                method : 'DELETE',
                url : '/delete',
                data : {_id : 1}
              }).done(function(결과){
                
              });
    });

    delete라는 class를 주고 클릭시 반응하게 만들어준다. 이제 ajax시 보내는 data의 _id만 상황에 맞게 가면 된다.

    즉, X번 버튼을 누르면 X번 게시물이 삭제되어야 한다. X번 게시물의 _id값이 오면 된다.

    먼저, 글번호를 만들어준다.

    <p>글번호 : <%= posts[i]._id %></p>
    <h4>할일 제목 : <%= posts[i].제목 %></h4>
    <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
    <button class="btn btn-primary delete" data-id="<%= posts[i]._id %>">삭제</button>

    글번호를 만들고, 버튼에 data-id를 이용해 보이지 않는 아이디를 저장해준다. 그러고

    var 글번호 = e.target.dataset.id;

    delete버튼을 클릭하면, 글번호라는 변수를 만들고, e.target (현재클릭한요소의).dataset.id (data-id값)을 담아준다. 그리고

    data : {_id : 글번호 }

    ajax로 전송할 data에 _id : 글번호 를 적어주면 된다. 

    여기까지하면 게시물 삭제버튼을 누르고 MongDB에서 새로고침 후, 다시 홈페이지에서 새로고침을 누르면 삭제된 것을 볼 수 있다.

    .done(function(결과){
                //페이지를 강제로 새로고침해주세요
                //삭제버튼을 누른 li요소를 제거해주세요
    });

    그래서 ajax가 성공하면 (done 함수) 위의 내용을 실행하게하면 버그를 제거할 수 있다.

    db.collection('post').deleteOne(요청.body, function(에러, 결과){//삭제해주는 함수
            console.log('삭제완료');
            응답.status(200).send( {message : '성공했습니다'} ) //응답코드 200을 보내주고 메세지도보내주셈
    // 200은 성공했다는 뜻 400은 고객잘못으로 요청실패라는 뜻 500은 서버문제로 요청실패라는 뜻
    //서버가 꼭 뭔가 응답해줘야 ajax가 잘 작동함
     })

    위처럼 server.js에 작성을 해서 서버에서 어떤걸 응답할지 정해줄 수 있는데, 

    응답.status()라 적어서 안에 코드를 입력하면 된다. 200,400,500등 여러가지가 있고 지금은 200을 써서 무조건 성공하게 해주세요 라고 쓴다. 그리고 .send를 써서 메시지도 보내준다 send('성공했습니다')이렇게 오브젝트로 안써도 괜찮지만, 메시지가 여러개면 오브젝트형태로 작성해준다.

    $('.delete').click(function(e) {
              var 글번호 = e.target.dataset.id;
              var 지금누른거 = $(this);//제이쿼리의 this는 현재 이벤트가 동작하는 것을 뜻함
    
              $.ajax({
                method : 'DELETE',
                url : '/delete',
                data : {_id : 글번호 }
              }).done(function(결과){
              //성공했는지 실패했는지 알려줘야함 즉, 서버에서 응답을 해줘야 done을 실행시킨다.
                
                console.log('성공했어염');
                //페이지를 강제로 새로고침해주세요
                // location.reload();
                //삭제버튼을 누른 li요소를 제거해주세요
                지금누른거.parent('li').fadeOut();
                //.parent()는 ~의 부모태그를 찾아주세요 여기선 li찾음
    
              }).fail(function(xhr, textStatus, errorThrown){
    
                console.log(xhr, textStatus, errorThrown)
                //textStatus응답코드임 왜 실패했는지 나옴
                //errorThrown에러메시지임 
              })
          })

    이제 list.ejs에서 지금누른거 라는 변수를 $(this)로 만들어준다. this는 현재 이벤트를 의미하며,

    ajax의 done에 지금누른거.parent('li')를 작성해서 삭제버튼의 부모인 li태그를 찾아서 fadeOut 처리를 해준다. 

     

    만약, 실패했을때도 작성할 수 있는데, 위처럼 함수와 파라미터를 적어주면 된다.

    'Node.js,MongoDB' 카테고리의 다른 글

    css 사용  (0) 2022.04.08
    URL 파라미터  (0) 2022.04.07
    게시물 각각에 번호달기(numbering)  (0) 2022.04.04
    HTML에 DB데이터 넣기  (0) 2022.04.04
    MongoDB에 자료저장  (0) 2022.04.01

    댓글

Designed by Tistory.