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

home2 게시판 Node.js, Express 게시판 Cannot read properties of undefined (reading 'length')

Cannot read properties of undefined (reading 'length')

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

    장선웅
    참가자
    search index강의 듣는중에 /search로 접속하면 Cannot read properties of undefined (reading 'length') 이런오류가 뜨더라구요
    /list에서 검색창에 이닦기같은것들을 입력하고 검색버튼 누르면 아무것도 실행이 되지않습니다 ㅜ
    
    
    search.ejs 코드
    
    
    <div class="container">
    <ul class="list-group">
    <% for (var i = 0; i < posts.length ; i++){ %>
    <li class="list-group-item">
    <p>글번호 : <%= posts[i]._id %></p>
    <h4>할일 제목 : <%= posts[i].제목 %> </h4>
    <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
    <button class="btn btn-danger delete" data-id="<%= posts[i]._id %>">삭제</button>
    
    <% } %>
    
    </div>
    <script>
    $('#search').click(function(){
    var 입력한값 = $('#search-input').val()
     window.location.replace('/search?value=' + 입력한값)
    })
    </script>
    
    list.ejs 코드
    
    
    <div class="container">
    <ul class="list-group">
    <% for (var i = 0; i < posts.length ; i++){ %>
    <li class="list-group-item">
    <p>글번호 : <%= posts[i]._id %></p>
    <h4>할일 제목 : <%= posts[i].제목 %> </h4>
    <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
    <button class="btn btn-danger delete" data-id="<%= posts[i]._id %>">삭제</button>
    
    <% } %>
    
    </div>
    <script>
    $('#search').click(function(){
    var 입력한값 = $('#search-input').val();
     window.location.replace('/search?value=' + 입력한값)
    });
    </script>
    
    server 코드 
    
    app.get('/search', (요청, 응답)=>{
    var 검색조건 = [
    {
    $search: {
    index: 'titleSearch',
    text: {
    query: 요청.query.value,
    path: ['제목', '날짜']
    }
    }
    },
    { $sort : { _id : 1 } },
    { $limit : 10}
    ]
     db.collection('post').aggregate(검색조건).toArray((에러, 결과)=>{
     console.log(결과)
     응답.render('search.ejs', {posts : 결과})
    })
    })
    
    #78953

    codingapple
    키 마스터
    서버에서 console.log(결과) 내용은 잘 출력되나요
    #79067

    장선웅
    참가자
    /list에서 검색해도 무반응이며 console.log 서버에서 무응답입니다
    #79144

    codingapple
    키 마스터
    검색버튼에 id="search" 잘 넣었나 확인해봅시다
    #79256

    장선웅
    참가자
    list.ejs / search.ejs에 
    <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>
    들어가있습니다.
    #79258

    장선웅
    참가자
    풀코드입니다 (server.js)
    const express = require('express');
    const app = express();
    const bodyParser = require('body-parser');
    app.use(bodyParser.urlencoded({extended : true}));
    const MongoClient = require('mongodb').MongoClient;
    const methodeOverride =require('method-override')
    app.use(methodeOverride('_methode'))
    app.set('view engine', 'ejs');
    app.use('/public', express.static('public'));
    require('dotenv').config()
    MongoClient.connect('mongodb+srv://-@sunwoong.pbgylxn.mongodb.net/?retryWrites=true&w=majority', function(에러, client){
     
     
    if(에러) return console.log(에러)
     db = client.db('todoapp'); //mongodb의 todoapp에 연결
     
    ///db.collection('post').insertOne({이름 : 'Woong', 나이 : 25}, function(에러, 결과){
    // console.log('저장완료')
    // })
     app.listen(8080, function(){
     console.log('listening on 8080')
    });
    });
    
    
    
    
    // 누군가가 /?? 으로 방문을 하면..
    // ??관련된 안내문을 띄워주자
    // app.get('/index', function(요청, 응답){ // '/'는 기본값홈페이지로 지정함
    // 응답.render('/index.ejs')
    //});
    // app.get('/write', function(요청, 응답){
    // 응답.render('/write.ejs');
    //});
    app.get('/index', function(요청, 응답){
     db.collection('post').find().toArray(function(에러, 결과){
     console.log(결과);
     응답.render('index.ejs', { posts : 결과});
    });
    });
    app.get('/', function(요청, 응답){
     db.collection('post').find().toArray(function(에러, 결과){
     console.log(결과);
     응답.render('write.ejs', { posts : 결과});
    });
    });
    
    
    //어떤 사람이 /add 경로로 POST 요청을 하면...
    //?? 를 해주세요~
    app.post('/add', function(요청, 응답){
     응답.send('전송완료!!!')
     db.collection('counter').findOne({name : '게시물갯수'}, function(에러, 결과){
     console.log(결과.totalPost)
    var 총게시물갯수 = 결과.totalPost;
     db.collection('post').insertOne( { _id : 총게시물갯수 + 1, 제목 : 요청.body.title, 날짜 : 요청.body.date } , function(){
     console.log('저장완료');
    //counter라는 콜렉션에 있는 totalPost 라는 항목도 1 증가시켜야함 (수정)
     db.collection('counter').updateOne({name:'게시물갯수'},{ $inc : {totalPost:1} },function(에러, 결과){
    if(에러){return console.log(에러)}
    })
    });
    });
     
    });
    ///list로 GET요청으로 접속하면
    //실제 DB에 저장된 데이터들로 예쁘게 꾸며진HTML을 보여줌
    app.get('/list', function(요청, 응답){
    //디비에 저장된 post라는 collection안의 모든 데이터를 꺼내주세요
     db.collection('post').find().toArray(function(에러, 결과){
     console.log(결과);
     응답.render('list.ejs', { posts : 결과}); //여기가 ejs 파일 보여주는거임
    //왜 이렇게 코드 짯냐면 데이터를 먼저 꺼내오고 ejs를 보여줘야겠죠?
    });
    });
    app.get('/search', (요청, 응답)=>{
    var 검색조건 = [
    {
    $search: {
    index: 'titleSearch',
    text: {
    query: 요청.query.value,
    path: ['제목', '날짜']
    }
    }
    },
    { $sort : { _id : 1 } },
    { $limit : 10}
    ]
     db.collection('post').aggregate(검색조건).toArray((에러, 결과)=>{
     console.log(결과)
     응답.render('search.ejs', {posts : 결과})
    })
    })
     
    
    
    app.delete('/delete', function(요청, 응답){
     console.log(요청.body)
     요청.body._id = parseInt(요청.body._id);
    //요청.body에 담겨온 게시물번호를 가진 글을 db에서 찾아서 삭제해주세요
     db.collection('post').deleteOne(요청.body, function(에러, 결과){
     console.log('삭제완료');
     응답.status(200).send({ messsage : '성공했습니다' });
    });
    });
    
    
    app.get('/detail/:id', function(요청, 응답){
     db.collection('post').findOne({_id : parseInt(요청.params.id)}, function(에러, 결과){
     console.log(결과);
     응답.render('detail.ejs', {data : 결과});
    //어떤사람이 detail/??로 접속하면
    //DB에서 {_id:?}인 게시물로 찾음 요청.params.id
    //찾은 결과를 detail.ejs로 보냄
    })
    })
    app.get('/edit/:id', function(요청,응답){
     db.collection('post').findOne({_id : parseInt(요청.params.id)}, function(에러, 결과){
     console.log(결과)
     응답.render('edit.ejs', {post : 결과})
    })
     
    })
    //$set은 업데이트 해주세요(없으면 추가해주시고요)
    app.put('/edit', function(요청, 응답){
     db.collection('post').updateOne({ _id : parseInt(요청.body.id)},{ $set : { 제목: 요청.body.title, 날짜 : 요청.body.date } }, function
    (에러, 결과){
     console.log('수정완료')
     응답.redirect('/list')
    })
     
    });
    const passport = require('passport');
    const LocalStraregy = 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')
    });
    app.post('/login', passport.authenticate('local', {
    failureRedirect : '/fail' // 실패하면 이거코드 실행
    }), function(요청, 응답){
     응답.redirect('/') // 성공하면 회원인증하고 redirect
    });
    app.get('/mypage', 로그인했니, function(요청, 응답){
     console.log(요청.user)
     응답.render('mypage.ejs', {사용자 : 요청.user})
    })
    function 로그인했니(요청, 응답, next){
    if(요청.user){
    next()
    }else {
     응답.send('로그인 해주세요!')
    }
    }
    //로그인기능 구현 및 id/pw Strategy이용해서 DB와 맞는지
    passport.use(new LocalStraregy({
    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) { //DB에 아이디가 있으면, 입력한비번과 결과.pw 비교
    return done(null, 결과)
    } else {
    return done(null, false, { message: '비번틀렸어요' })
    }
    })
    }));
    //세션 만들기
    passport.serializeUser(function(user, done){ //세션을 저장시키는 코드(로그인 성공시 발동)
    done(null, user.id)
    });
    passport.deserializeUser(function(아이디, done){ //이 세션 데이터를 가진 사람을 DB에서 찾아주세요(마이페이지 접속시 발동)
     db.collection('login').findOne({id : 아이디}, function(에러, 결과){
    done(null, 결과)
    })
     
    });
     
    #79259

    장선웅
    참가자
    search.ejs
    <!doctype html>
    <html lang="kor">
    <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.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    <link rel="stylesheet" href="/public/main.css">
    <title>hi</title>
    </head>
    <body>
     
    <%- include('nav.html') %> <!-- 나는 이자리에 nav.html을 박을거임-->
     
    <h4 class="ml-2 my-3 text-center">검색결과 리스트📦</h4><!--점찍고 제목이나 날짜-->
     
    <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">
    <ul class="list-group">
    <% for (var i = 0; i < posts.length ; i++){ %>
    <li class="list-group-item">
    <p>글번호 : <%= posts[i]._id %></p>
    <h4>할일 제목 : <%= posts[i].제목 %> </h4>
    <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
    <button class="btn btn-danger delete" data-id="<%= posts[i]._id %>">삭제</button>
    
    <% } %>
    
    </div>
    <script>
    $('#search').click(function(){
    var 입력한값 = $('#search-input').val()
     window.location.replace('/search?value=' + 입력한값)
    })
    </script>
     
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> </script>
     
    <script>
    $('.delete').click(function(e){
    var 글번호 = e.target.dataset.id; //내가 누른 요소의 data-id
    var 지금누른거 = $(this);
     $.ajax({
    method : 'DELETE',
    url : '/delete',
    data : {_id : 글번호}
    }).done(function(결과){
    //페이지를 강제 새로고침해주세요
     console.log('성공했어염');
     지금누른거.parent('li').fadeOut(); //글 연기처럼 사라지기
    }).fail(function(xhr, textStatus, errorThrown){
     console.log(xhr, textStatus, errorThrown);
    });
    })
     
    </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.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" 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.2/dist/js/bootstrap.min.js" integrity="sha384-+sLIOodYLS7CIrQpBjl+C7nPvqq+FbNUBDunl/OZv93DB7Ln/533i8e/mZXLi/P+" crossorigin="anonymous"></script>
     -->
    </body>
    </html>
    #79263

    장선웅
    참가자
    list.ejs
    
    <!doctype html>
    <html lang="kor">
    <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.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    <link rel="stylesheet" href="/public/main.css">
    <title>hi</title>
    </head>
    <body>
     
    <%- include('nav.html') %> <!-- 나는 이자리에 nav.html을 박을거임-->
     
    <h4 class="ml-2 my-3 text-center">서버에서 가져온 할일 리스트</h4><!--점찍고 제목이나 날짜-->
     
    <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">
    <ul class="list-group">
    <% for (var i = 0; i < posts.length ; i++){ %>
    <li class="list-group-item">
    <p>글번호 : <%= posts[i]._id %></p>
    <h4>할일 제목 : <%= posts[i].제목 %> </h4>
    <p>할일 마감날짜 : <%= posts[i].날짜 %></p>
    <button class="btn btn-danger delete" data-id="<%= posts[i]._id %>">삭제</button>
    
    <% } %>
    
    </div>
    <script>
    $('#search').click(function(){
    var 입력한값 = $('#search-input').val();
     window.location.replace('/search?value=' + 입력한값)
    });
    </script>
     
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> </script>
     
    <script>
    $('.delete').click(function(e){
    var 글번호 = e.target.dataset.id; //내가 누른 요소의 data-id
    var 지금누른거 = $(this);
     $.ajax({
    method : 'DELETE',
    url : '/delete',
    data : {_id : 글번호}
    }).done(function(결과){
    //페이지를 강제 새로고침해주세요
     console.log('성공했어염');
     지금누른거.parent('li').fadeOut(); //글 연기처럼 사라지기
    }).fail(function(xhr, textStatus, errorThrown){
     console.log(xhr, textStatus, errorThrown);
    });
    })
    
    
     
    </script>
    
    
    <!-- <h4>할일 제목 : <%= posts[0].제목 %> </h4> 
     <p>할일 마감날짜 : <%= posts[0].날짜 %></p>
     
     <h4>할일 제목 : <%= posts[1].제목 %> </h4>
     <p>할일 마감날짜 : <%= posts[1].날짜 %></p> -->
    
    
    
    
    <!-- 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.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" 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.2/dist/js/bootstrap.min.js" integrity="sha384-+sLIOodYLS7CIrQpBjl+C7nPvqq+FbNUBDunl/OZv93DB7Ln/533i8e/mZXLi/P+" crossorigin="anonymous"></script>
     -->
    </body>
    </html>
    #79292

    codingapple
    키 마스터
    search.ejs에서 jquery설치파일 밑에 코드작성합시다 자바스크립트에러는 크롬 콘솔창에 뜹니다
9 글 보임 - 1 에서 9 까지 (총 9 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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