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

home2 게시판 Node.js, Express 게시판 글목록 is not defined

글목록 is not defined

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

    최원호
    참가자
    자꾸 아래와 같은 글목록이 정의 되어 있지 않다고 메세지가 떠서 해결방법을 찾고 있습니다.
    어떻게 수정을 봐야 할까요?
    ReferenceError: C:\workspace\sw\ticketNode\views\search.ejs:22
        20|   <h4>검색결과</h4>
        21|     <div class="white-bg">
     >> 22|       <%  for(let k=0;k<글목록.length;k++){ %>
        23|       <div class="list-box">
        24|         <h4>">
        25|             <%= 글목록[k].title %>
    글목록 is not defined
        at eval ("C:\\workspace\\sw\\ticketNode\\views\\search.ejs":15:23)
        at search (C:\workspace\sw\ticketNode\node_modules\ejs\lib\ejs.js:703:17)
        at tryHandleCache (C:\workspace\sw\ticketNode\node_modules\ejs\lib\ejs.js:274:36)
        at exports.renderFile [as engine] (C:\workspace\sw\ticketNode\node_modules\ejs\lib\ejs.js:491:10)
        at View.render (C:\workspace\sw\ticketNode\node_modules\express\lib\view.js:135:8)
        at tryRender (C:\workspace\sw\ticketNode\node_modules\express\lib\application.js:657:10)
        at Function.render (C:\workspace\sw\ticketNode\node_modules\express\lib\application.js:609:3)
        at ServerResponse.render (C:\workspace\sw\ticketNode\node_modules\express\lib\response.js:1039:7)
        at C:\workspace\sw\ticketNode\server.js:262:6
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    list.ejs
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link href="/main.css" rel="stylesheet">
    </head>
    <body class="grey-bg">
        <%- include('nav.ejs') %>
    <input class="search">
    <button class="search-send">검색</button>
    <script>
    document.querySelector('.search-send').addEventListener('click', function(){
        let 입력한거 = document.querySelector('.search').value
        location.href = '/search?val=' + 입력한거
      })
      </script>
        <div class="white-bg">
          <%  for(let k=0;k<글목록.length;k++){ %>
          <div class="list-box">
            <h4>">
                <%= 글목록[k].title %>
            
        ">✏️
        <span class="delete" data-id="<%= 글목록[k]._id %>">🗑️</span>
        </h4>
           <p> 글내용">
           </p>
        
         </div>
      <%  } %>
        </div>
        <h4>검색결과</h4>
        ">다음
        <script>
            for(let k=0;k<'<%=글목록.length%>';k++){
              
            
    document.querySelectorAll('.delete')[0]
          .addEventListener('click',function(e){
            e.target.dataset.id
            fetch('/delete?docid='+e.target.id,{
              method:'DELETE'
              
            })
            .then((r)=>r.text())
            .then((r)=>{
              e.target.parentElement.parentElement.style='none'
             })
            })
          }
        </script>
      </body>
    </html>
    
    server.js
    
    const express =require('express')
    const app=express()
    const methodOverride=require('method-override')
    const bcrypt=require('bcrypt')
    require('dotenv').config()
    app.use(express.static(__dirname+'/public'))
    app.set('view engine','ejs')
    app.use(express.json())
    app.use(express.urlencoded({extended:true}))
    app.use(methodOverride('_method'))
    const session = require('express-session')
    const passport = require('passport')
    const LocalStrategy = require('passport-local')
    const MongoStore=require('connect-mongo')
    app.use(passport.initialize())
    app.use(session({
      secret: '암호화에 쓸 비번',
      resave : false,
      saveUninitialized : false,
      cookie:{maxAge:60*60*1000},
      store:MongoStore.create({
        mongoUrl:process.env.DB_URL,
        dbName:'ticketnode'
      })
    }))
    app.use(passport.session())
    const { S3Client } = require('@aws-sdk/client-s3')
    const multer = require('multer')
    const multerS3 = require('multer-s3')
    const s3 = new S3Client({
      region : 'ap-northeast-2',
      credentials : {
          accessKeyId : process.env.S3_KEY,
          secretAccessKey : process.env.S3_SECRET
      }
    })
    const upload = multer({
      storage: multerS3({
        s3: s3,
        bucket: 'ticketnode',
        key: function (요청, file, cb) {
          cb(null, Date.now().toString()) //업로드시 파일명 변경가능
        }
      })
    })
    const { MongoClient, ObjectId } = require('mongodb')
    let connectDB=require('./database.js')
    let db
    connectDB.then((client)=>{
      console.log('DB연결성공')
      db = client.db('ticketnode')
      app.listen(process.env.PORT,()=>{
        console.log('http://localhost:8091에서 서버 실행중')
    })
    }).catch((err)=>{
      console.log(err)
    })
    function checkLogin(요청,응답,next) {
      if(!요청.user) {
        응답.send('로그인 하세요')
      }
      next()
    }
    app.use('/URL',checkLogin)
    app.get('/',(요청,checkLogin,응답)=>{
    응답.sendFile(__dirname+'/index.html')
    })
    
    
    app.get('/about',(요청,응답)=>{
        응답.sendFile(__dirname+'/about.html')
        })
        
    app.get('/news',(요청,응답)=>{
        db.collection('post').insertOne({title:'MongoDB launching'})
        응답.send('오늘 비옴')
    })
    app.get('/shopping',(요청,응답)=>{
        응답.send('쇼핑 페이지입니다')
    })
    app.get('/list',async(요청,응답)=>{
        let result=await db.collection('post').find().toArray()
      
        응답.render('list.ejs',{글목록:result})
    })
    app.get('/time',(요청,응답)=>{
       // let result=await db.collection('post').find().toArray()
       응답.render('time.ejs',{time:new Date()})
    })
    app.get('/write',(요청,응답)=>{
        응답.render('write.ejs')
    })
    app.post('/add',upload.single('img1'), async(요청,응답)=>{
       //console.log(요청.file.location)
       try{
       if(요청.body.title=='') {
        응답.send('제목을 입력안했는데?')
       }else {
       await db.collection('post').insertOne({title:요청.body.title,content:요청.body.content,img:요청.file.location})
        응답.redirect('/list')
       }
    } catch(e) {
      console.log(e)
      응답.status(500).send('서버에러남')
    }
    })
    app.get('/detail/:id',async(요청,응답)=>{
        try{
       let result= await db.collection('post').findOne({_id:new ObjectId(요청.params.id)})
       console.log(result)
        응답.render('detail.ejs',{result:result})
        }catch(e) {
            console.log(e)
            응답.status(404).send('이상한 url 입력함')
        }
    })
    //수정페이지
    app.get('/edit/:id', async(요청,응답)=>{
        await db.collection('post').updateOne({_id:new ObjectId(요청.body.id)},
        {$set:{title:요청.body.title,content:요청.body.content}})
      
        let result=await db.collection('post').findOne({_id:new ObjectId(요청.params.id)})
    응답.render('edit.ejs',{result:result})
     })
    app.post('/edit',async(요청,응답)=>{
      let result= await db.collection('post').updateOne({_id:new ObjectId(요청.body.id)},
         {$set:{title:요청.body.title,content:요청.body.content}})
         console.log(요청.body)
        응답.redirect('/list')
    })
    app.put('/edit', async(요청,응답)=>{
        await db.collection('post').updateMany({_id:{$gt:12}},
           {$inc:{like:-2}})
        //   console.log(요청.body)
         // 응답.redirect('/list')
      })
      
      app.post('/abc',async(요청,응답)=>{
       // console.log('ajax 이용')
        console.log(요청.query)
      })
      app.get('/abc/:id',async(요청,응답)=>{
       // console.log('ajax 이용')
        console.log(요청.params)
      })
      app.delete('/delete',async(요청, 응답)=>{
        console.log(요청.query)
        await db.collection('post').deleteOne({_id:new ObjectId(요청.query.docid)})
        응답.send('삭제완료')  
    })
    app.get('/list/:id',async(요청,응답)=>{
        let result=await db.collection('post')
        .find().skip((요청.params.id-1)*5).limit(5).toArray()
        응답.render('list.ejs',{글목록:result})
    })
    app.get('/list/next/:id',async(요청,응답)=>{
        let result=await db.collection('post')
        .find({_id:{$gt:new ObjectId(요청.params.id)}}).limit(5).toArray()
        응답.render('list.ejs',{글목록:result})
    })
        passport.use(new LocalStrategy(async (입력한아이디, 입력한비번, cb) => {
        let result = await db.collection('user').findOne({ username : 입력한아이디})
        if (!result) {
          return cb(null, false, { message: '아이디 DB에 없음' })
        }
        if (await bcrypt.compare(입력한비번,result.password)) {
          return cb(null, result)
        } else {
          return cb(null, false, { message: '비번불일치' });
        }
      }))
      passport.serializeUser((user,done)=>{
        console.log(user)
       process.nextTick(()=>{
           done(null,{id:user._id,username:user.username})
        })
      })
      passport.deserializeUser(async(user,done)=>{
            let result= await db.collection('user')
            .findOne({_id:new ObjectId(user.id)})
            delete result.password
          process.nextTick(()=> { done(null,result)
        })
      })
    app.get('/login',async(요청,응답)=>{
        console.log(요청.user)
        응답.render('login.ejs')
    })
    app.post('/login',async(요청,응답,next)=>{
        passport.authenticate('local',(error,user,info)=>{
            if(error) return 응답.status(500).json(error)
            if(!user) return 응답.status(401).json(info.message)
            요청.login(user,(err)=>{
        if(err) return next(err)
        응답.redirect('/')
        })
        })
    (요청,응답,next)    
    })
    app.get('/register',(요청,응답)=>{
      응답.render('register.ejs')
    })
    app.post('/register',async(요청,응답)=>{
      let hashing=await bcrypt.hash('요청.body.password',15)
    //  console.log(hashing)
     await db.collection('user').insertOne({
      username:요청.body.username,
      passwordnad:hashing
     })
      응답.redirect('/')
    })
    app.use('/shop',require('./routes/shop.js'))
    app.get('/search',async(요청,응답)=>{
      console.log(요청.query.val)
      let result=await db.collection('post').find({$text:{$search:요청.query.val}}).toArray()
      console.log(result)
      응답.render('search.ejs'),{글목록:result}
    })
    
    search.ejs
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link href="/main.css" rel="stylesheet">
    </head>
    <body class="grey-bg">
        <%- include('nav.ejs') %>
    <input class="search">
    <button class="search-send">검색</button>
    <script>
    document.querySelector('.search-send').addEventListener('click', function(){
        let 입력한거 = document.querySelector('.search').value
        location.href = '/search?val=' + 입력한거
      })
      </script>
      
      <h4>검색결과</h4>
        <div class="white-bg">
          <%  for(let k=0;k<글목록.length;k++){ %>
          <div class="list-box">
            <h4>">
                <%= 글목록[k].title %>
            
        ">✏️
        <span class="delete" data-id="<%= 글목록[k]._id %>">🗑️</span>
        </h4>
           <p> 글내용">
           </p>
        
         </div>
      <%  } %>
        </div>
        ">다음
        
      </body>
    </html>
    #108175

    codingapple
    키 마스터
    응답.render('search.ejs', {글목록:result}) 인듯요
    #109245

    최원호
    참가자
    스크린샷 2024-01-07 160459
    
    수정해서 검색하는데 아래와 같이 에러메세지가 뜹니다.
    
    스크린샷 2024-01-07 160559
    
     이유가 뭘까요? MongoDB에서는 인덱스를 생성했씁니다. 나머지 ejs화일은 위와 동일합니다.
    
    servr.js
    
    
    const express =require('express')
    const app=express()
    const methodOverride=require('method-override')
    const bcrypt=require('bcrypt')
    require('dotenv').config()
    app.use(express.static(__dirname+'/public'))
    app.set('view engine','ejs')
    app.use(express.json())
    app.use(express.urlencoded({extended:true}))
    app.use(methodOverride('_method'))
    const session = require('express-session')
    const passport = require('passport')
    const LocalStrategy = require('passport-local')
    const MongoStore=require('connect-mongo')
    app.use(passport.initialize())
    app.use(session({
      secret: '암호화에 쓸 비번',
      resave : false,
      saveUninitialized : false,
      cookie:{maxAge:60*60*1000},
      store:MongoStore.create({
        mongoUrl:process.env.DB_URL,
        dbName:'ticketnode'
      })
    }))
    app.use(passport.session())
    const { S3Client } = require('@aws-sdk/client-s3')
    const multer = require('multer')
    const multerS3 = require('multer-s3')
    const s3 = new S3Client({
      region : 'ap-northeast-2',
      credentials : {
          accessKeyId : process.env.S3_KEY,
          secretAccessKey : process.env.S3_SECRET
      }
    })
    const upload = multer({
      storage: multerS3({
        s3: s3,
        bucket: 'ticketnode',
        key: function (요청, file, cb) {
          cb(null, Date.now().toString()) //업로드시 파일명 변경가능
        }
      })
    })
    const { MongoClient, ObjectId } = require('mongodb')
    let connectDB=require('./database.js')
    let db
    connectDB.then((client)=>{
      console.log('DB연결성공')
      db = client.db('ticketnode')
      app.listen(process.env.PORT,()=>{
        console.log('http://localhost:8091에서 서버 실행중')
    })
    }).catch((err)=>{
      console.log(err)
    })
    function checkLogin(요청,응답,next) {
      if(!요청.user) {
        응답.send('로그인 하세요')
      }
      next()
    }
    app.use('/URL',checkLogin)
    app.get('/',(요청,checkLogin,응답)=>{
    응답.sendFile(__dirname+'/index.html')
    })
    
    
    app.get('/about',(요청,응답)=>{
        응답.sendFile(__dirname+'/about.html')
        })
        
    app.get('/news',(요청,응답)=>{
        db.collection('post').insertOne({title:'MongoDB launching'})
        응답.send('오늘 비옴')
    })
    app.get('/shopping',(요청,응답)=>{
        응답.send('쇼핑 페이지입니다')
    })
    app.get('/list',async(요청,응답)=>{
        let result=await db.collection('post').find().toArray()
      
        응답.render('list.ejs',{글목록:result})
    })
    app.get('/time',(요청,응답)=>{
       // let result=await db.collection('post').find().toArray()
       응답.render('time.ejs',{time:new Date()})
    })
    app.get('/write',(요청,응답)=>{
        응답.render('write.ejs')
    })
    app.post('/add',upload.single('img1'), async(요청,응답)=>{
       //console.log(요청.file.location)
       try{
       if(요청.body.title=='') {
        응답.send('제목을 입력안했는데?')
       }else {
       await db.collection('post').insertOne({title:요청.body.title,content:요청.body.content,img:요청.file.location})
        응답.redirect('/list')
       }
    } catch(e) {
      console.log(e)
      응답.status(500).send('서버에러남')
    }
    })
    app.get('/detail/:id',async(요청,응답)=>{
        try{
       let result= await db.collection('post').findOne({_id:new ObjectId(요청.params.id)})
       console.log(result)
        응답.render('detail.ejs',{result:result})
        }catch(e) {
            console.log(e)
            응답.status(404).send('이상한 url 입력함')
        }
    })
    //수정페이지
    app.get('/edit/:id', async(요청,응답)=>{
        await db.collection('post').updateOne({_id:new ObjectId(요청.body.id)},
        {$set:{title:요청.body.title,content:요청.body.content}})
      
        let result=await db.collection('post').findOne({_id:new ObjectId(요청.params.id)})
    응답.render('edit.ejs',{result:result})
     })
    app.post('/edit',async(요청,응답)=>{
      let result= await db.collection('post').updateOne({_id:new ObjectId(요청.body.id)},
         {$set:{title:요청.body.title,content:요청.body.content}})
         console.log(요청.body)
        응답.redirect('/list')
    })
    app.put('/edit', async(요청,응답)=>{
        await db.collection('post').updateMany({_id:{$gt:12}},
           {$inc:{like:-2}})
        //   console.log(요청.body)
         // 응답.redirect('/list')
      })
      
      app.post('/abc',async(요청,응답)=>{
       // console.log('ajax 이용')
        console.log(요청.query)
      })
      app.get('/abc/:id',async(요청,응답)=>{
       // console.log('ajax 이용')
        console.log(요청.params)
      })
      app.delete('/delete',async(요청, 응답)=>{
        console.log(요청.query)
        await db.collection('post').deleteOne({_id:new ObjectId(요청.query.docid)})
        응답.send('삭제완료')  
    })
    app.get('/list/:id',async(요청,응답)=>{
        let result=await db.collection('post')
        .find().skip((요청.params.id-1)*5).limit(5).toArray()
        응답.render('list.ejs',{글목록:result})
    })
    app.get('/list/next/:id',async(요청,응답)=>{
        let result=await db.collection('post')
        .find({_id:{$gt:new ObjectId(요청.params.id)}}).limit(5).toArray()
        응답.render('list.ejs',{글목록:result})
    })
        passport.use(new LocalStrategy(async (입력한아이디, 입력한비번, cb) => {
        let result = await db.collection('user').findOne({ username : 입력한아이디})
        if (!result) {
          return cb(null, false, { message: '아이디 DB에 없음' })
        }
        if (await bcrypt.compare(입력한비번,result.password)) {
          return cb(null, result)
        } else {
          return cb(null, false, { message: '비번불일치' });
        }
      }))
      passport.serializeUser((user,done)=>{
        console.log(user)
       process.nextTick(()=>{
           done(null,{id:user._id,username:user.username})
        })
      })
      passport.deserializeUser(async(user,done)=>{
            let result= await db.collection('user')
            .findOne({_id:new ObjectId(user.id)})
            delete result.password
          process.nextTick(()=> { done(null,result)
        })
      })
    app.get('/login',async(요청,응답)=>{
        console.log(요청.user)
        응답.render('login.ejs')
    })
    app.post('/login',async(요청,응답,next)=>{
        passport.authenticate('local',(error,user,info)=>{
            if(error) return 응답.status(500).json(error)
            if(!user) return 응답.status(401).json(info.message)
            요청.login(user,(err)=>{
        if(err) return next(err)
        응답.redirect('/')
        })
        })
    (요청,응답,next)    
    })
    app.get('/register',(요청,응답)=>{
      응답.render('register.ejs')
    })
    app.post('/register',async(요청,응답)=>{
      let hashing=await bcrypt.hash('요청.body.password',15)
    //  console.log(hashing)
     await db.collection('user').insertOne({
      username:요청.body.username,
      passwordnad:hashing
     })
      응답.redirect('/')
    })
    app.use('/shop',require('./routes/shop.js'))
    app.get('/search',async(요청,응답)=>{
    console.log(요청.query.val)
      let 검색조건=[
        {$sear:{
          index:'title_index',
          text:{query:'요청.query.val',path:'title'}
        }}
      ]
      
      let result=await db.collection('post')
      .aggregate(검색조건).toArray()
      응답.render('search.ejs',{글목록:result})
    //   console.log(요청.query.val)
    //   let result=await db.collection('post').find({$text:{$search:요청.query.val}}).toArray()
    //   console.log(result)
    //   응답.render('search.ejs',{글목록:result})
    //
     })
    
    
    
    
    
    
    
    
    
    
    #109280

    codingapple
    키 마스터
    app.get('/search',async(요청,응답)=>{
    console.log(요청.query.val)
      let 검색조건=[
        {$sear:{
    
    sear는 오타인듯요
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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