• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 DELETE 기능과 EDIT 기능 오류 문의입니다.

DELETE 기능과 EDIT 기능 오류 문의입니다.

7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 글쓴이
  • #37775

    유정현
    참가자
    MongoError: BSON field 'delete.deletes.q' is the wrong type 'int', expected type 'object'
        at Connection.<anonymous> (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\pool.js:451:61)
        at Connection.emit (node:events:537:28)
        at processMessage (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\connection.js:451:10)
        at TLSSocket.<anonymous> (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\connection.js:620:15)
        at TLSSocket.emit (node:events:537:28)
        at addChunk (node:internal/streams/readable:324:12)
        at readableAddChunk (node:internal/streams/readable:297:9)
        at Readable.push (node:internal/streams/readable:234:10)
        at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) {
      ok: 0,
      code: 14,
      codeName: 'TypeMismatch',
      '$clusterTime': {
        clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1656596363 },
        signature: { hash: [Binary], keyId: [Long] }
      },
      operationTime: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1656596360 }
    }
    [
      {
        _id: 1,
        '제목': '이러한이유',
        '날짜': 'Thu Jun 30 2022 22:19:19 GMT+0900 (한국 표준시)',
        '내용': '저러한이유'
      }
    ]
    
    
    DELETE할 경우 이러한 오류가 나옵니다. 아무리 찾아봐도 방법을 모르겠습니다 ㅠㅠ 알려주시면 감사하겠습니다.
    #37776

    유정현
    참가자
    const express = require('express');
    const app = express();
    const bodyParser = require('body-parser');
    app.use(express.urlencoded({ extended: true }));
    const MongoClient = require('mongodb').MongoClient
    app.set('view engine', 'ejs');
    app.engine('ejs', require('ejs').__express);
    app.use('/public', express.static('public'))
    const methodOverride = require('method-override')
    app.use(methodOverride('_method'))
    require('dotenv').config()
    MongoClient.connect(process.env.DB_URL, function(에러, client){
    if(에러) return console.log(에러)    
    db = client.db('todoapp');
    app.listen(process.env.PORT, function() {
        console.log('listening on 8080')
      });
    });
    app.get('/write', function(요청, 응답){
      응답.render('write.ejs', { });
      
    });
    app.get('/',function(요청, 응답){
      응답.render('index.ejs', { });
       
    });
    app.post('/add', function (요청, 응답) {
        db.collection('counter').findOne({name : '게시물개수'}, function(에러, 결과){
          var 총게시물개수 = 결과.totalPost
      
          db.collection('post').insertOne({ _id : 총게시물개수 + 1, 제목 : 요청.body.title,날짜: new Date(), 내용 : 요청.body.textBlank }, function (에러, 결과) {
            db.collection('counter').updateOne({name:'게시물개수'},{ $inc: {totalPost:1} },function(에러, 결과){ 
              if(에러){return console.log(에러)}
              응답.send('전송완료');
            })
          })
      
        })
      })
    
    
      app.get('/list', function(요청, 응답){
        db.collection('post').find().toArray(function(에러, 결과){
          console.log(결과)
          응답.render('list.ejs', { posts : 결과 })
        })
      })
    app.delete('/delete', function(요청, 응답){
        요청.body._id = parseInt(요청.body._id)
        db.collection('post').deleteOne(요청.body._id, function(에러, 결과){
          console.log('삭제완료')
          console.log(요청.body._id)
          console.log(에러)
          응답.status(200).send({ message : '성공했습니다.'});
        })
        
      });
      app.get('/detail/:id', function(요청, 응답){
        db.collection('post').findOne({_id : parseInt(요청.params.id)}, function(에러, 결과){
          console.log(결과);
          console.log(에러);
          응답.render('detail.ejs', {  data : 결과 });
        })
        
      })
      app.get('/edit/:id', function(요청, 응답){
        
        db.collection('post').findOne({_id : parseInt(요청.params.id)}, function(에러, 결과){
          console.log(결과);
          console.log(에러);
          응답.render('edit.ejs', {post : 결과})
        })
      })
      app.put('/edit', function(요청, 응답){
        
        db.collection('post').updateOne({_id : parseInt(요청.body.id) },{$set : {제목: 요청.body.title, 날짜: new Date(), 내용: 요청.body.textBlank}},function(에러, 결과){
          console.log('수정완료')
          console.log(에러)
          응답.redirect('/list')
        })
      })
      
      const passport = require('passport');
      const LocalStrategy = require('passport-local').Strategy;
      const session = require('express-session');
      app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
      app.use(passport.initialize());
      app.use(passport.session());
      app.get('/login', function(요청, 응답){
        응답.render('login.ejs')
        //로그인 페이지를 읽으면 login페이지를 보여줘라
      });
      app.post('/login', passport.authenticate('local', {
        failureRedirect : '/fail' //로그인사이트에서 뭘 쓰면 무엇을해라
      }), function(요청, 응답){
        응답.redirect('/')
      });
      app.get('/mypage', 로그인했니, function (요청, 응답) { 
        console.log(요청.user)
      응답.render('mypage.ejs', {사용자 : 요청.user}) 
    })
    function 로그인했니(요청, 응답, next) { 
      if (요청.user) { 
        next() 
      } 
      else { 
        응답.send("<script>alert('로그인해주세요.'); window.location.replace('/login');</script>")
        
      } 
    }
    
    
      passport.use(new LocalStrategy({
        usernameField: 'id',
        passwordField: 'pw',
        session: true,
        passReqToCallback: false,
      }, function (입력한아이디, 입력한비번, done) {
        //console.log(입력한아이디, 입력한비번);
        db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
          if (에러) return done(에러)
      
          if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
          if (입력한비번 == 결과.pw) {
            return done(null, 결과)
          } else {
            return done(null, false, { message: '비번틀렸어요' })
          }
        })
      }));
      passport.serializeUser(function (user, done) {
        done(null, user.id)
      });
      
      passport.deserializeUser(function (아이디, done) {
        db.collection('login').findOne({id : 아이디}, function(에러, 결과){
          done(null, 결과)
        })
      });
    
    
    //요청은 모든 데이터를 꺼냄 그중 query를 꺼내고 사용자가 입력한 value를 최종적으로 꺼냄
      app.get('/search', (요청, 응답)=>{
        console.log(요청.query);
        db.collection('post').find({제목 : 요청.query.value}).toArray((에러, 결과)=>{
          console.log(결과)
          응답.render('search.ejs', { posts : 결과 })
        })
      })
    
    
    
    
    SERVER.JS 전체코드입니다.
    #37777

    유정현
    참가자
    <!doctype html>
    <html >
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
        <link rel="stylesheet" href="/public/main.css">
        <title>Hello, world!</title>
      </head>
      <body>
        <%- include('nav.html') %>
        <div class="container input-group mb-2">
          <input class="form-control" id="search-input">
          <button class="input-group-append btn btn-danger" id="search">검색</button>
        </div>
        <div class="container">
        <h1>할일 리스트
        </h1>
       <h2>글개수: <%=posts.length%></h2>
        <ul class="list-group">
          <% for (var i = 0; i < posts.length; i++){ %>
             <li class="list-group-item">
            ">  
              <p> 작성일 : <%= posts[i].날짜 %> </p>
              <h4> 제목: <%= posts[i].제목 %> </h4>
              <p> 수리접수내용 : <%= posts[i].내용 %> </p>
            
            
              <button class="delete" data-id="<%= posts[i]._id %>">삭제</button>
            
            <% } %>
          
        </div>
        <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" ></script>
       
        <script>
          $('.delete').click(function(e){
            var 글번호 = e.target.dataset.id;
            var 지금누른거 = $(this);
        $.ajax({
          method : 'DELETE',
          url : '/delete',
          data : { _id : 글번호 }
        }).done(function(결과){
          console.log('성공했습니다.')
          //AJAX 성공시 실행할 코드는 여기
          지금누른거.parent('li').fadeOut(); //지금누른거 부모중에 li가 있으면 사라지게해줘라
        }).fail(function(a,b,c){
          console.log(a,b,c)
          //xhr, textStatus,errorThrown 실패 파라미터 
        })
      });
         
     
        $('#search').click(function(){
        var 입력한값 = $('#search-input').val();
        window.location.replace('/search?value=' + 입력한값)
      });
        </script>
        <!-- Optional JavaScript; choose one of the two! -->
        <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
         <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
        <!-- Option 2: Separate Popper and Bootstrap JS -->
        <!--
        <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js" integrity="sha384-VHvPCCyXqtD5DqJeNxl2dtTyhF78xXNXdkwX1CZeRusQfRKp+tA7hAShOK/B/fQ2" crossorigin="anonymous"></script>
        -->
      </body>
    </html>
    
    
    
    
    
    
    
    
    
    
    
    
    list.ejs파일입니다.
    #37778

    유정현
    참가자
     delete가 문제네요 ㅠㅠ
    #37797

    codingapple
    키 마스터
    deleteOne 안에는 삭제할 document의 일부 정보를 넣으면 됩니다 
    { _id : 1, 글제목 : abc }
    이런 document를 삭제하고 싶으면 deleteOne({_id : 1}, function(){ }) 이렇게 코드를 짜야 삭제됩니다 
    #37899

    유정현
    참가자
    app.delete('/delete', function(요청, 응답){
        게시물삭제아이디 = parseInt(요청.body._id)
        db.collection('post').deleteOne(게시물삭제아이디, function(에러, 결과){
          console.log('삭제완료')
          console.log(게시물삭제아이디)
          console.log(에러)
          응답.status(200).send({ message : '성공했습니다.'});
        })
        
      });
    
    ----------------------------------------------------------------------------
    MongoError: BSON field 'delete.deletes.q' is the wrong type 'int', expected type 'object'
        at Connection.<anonymous> (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\pool.js:451:61)
        at Connection.emit (node:events:537:28)
        at processMessage (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\connection.js:451:10)
        at TLSSocket.<anonymous> (C:\nodestudy\TODOAPP\views\node_modules\mongodb\lib\core\connection\connection.js:620:15)
        at TLSSocket.emit (node:events:537:28)
        at addChunk (node:internal/streams/readable:324:12)
        at readableAddChunk (node:internal/streams/readable:297:9)
        at Readable.push (node:internal/streams/readable:234:10)
        at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) {
      ok: 0,
      code: 14,
      codeName: 'TypeMismatch',
      '$clusterTime': {
        clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1656823087 },
        signature: { hash: [Binary], keyId: [Long] }
      },
      operationTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1656823087 }
    }
    
    
    
    
    
    
    deleteOne에 게시물 삭제아이디를 넣었는데도 아래처럼 오류가 나옵니다.  int 타입이 잘못되었다고 나오는데 어떻게 해야하나요ㅕ??
    
    
    #37928

    codingapple
    키 마스터
    deleteOne({_id : 1} 이래야 되는데
    deleteOne(1, 이것만 넣어서 그런듯요 
    
7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠