4 글 보임 - 1 에서 4 까지 (총 4 중에서)
-
글쓴이글
-
2023년 12월 29일 06:57 #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>
2024년 1월 7일 16:10 #109245
최원호참가자수정해서 검색하는데 아래와 같이 에러메세지가 뜹니다.
이유가 뭘까요? 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}) // })
2024년 1월 7일 20:10 #109280
codingapple키 마스터app.get('/search',async(요청,응답)=>{ console.log(요청.query.val) let 검색조건=[ {$sear:{ sear는 오타인듯요
-
글쓴이글
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
- 답변은 로그인 후 가능합니다.