-
글쓴이글
-
2022년 4월 25일 04:12 #32463
황현우참가자<!doctype html>
<html>
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"><!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<!-- My css -->
<link rel="stylesheet" href="/css/styles.css">
<title>Todo App</title>
</head>
<body>
<%- include('nav.html')%><div class="container p-4 detail">
<h1>채팅방</h1>
<div class="row">
<div class="col-3">
<ul class="list-group chat-list">
<% for(let i=0; i < data.length; i++) { %>
<li class="list-group-item" data-id="<%=data[i]._id%>">
<h6><%=data[i].title%></h6>
<h6 class="text-small">날짜 : <%=data[i].date%></h6>
<h6 class="text-small">상대방ID : <%=data[i].member[i]%></h6>
</li>
<% } %>
</div>
<div class="col-9 p-0">
<div class="chat-room">
<ul class="list-group chat-content">
<li><span class="chat-box">채팅방1 내용</span></li>
<li><span class="chat-box">채팅방1 내용</span></li>
<li><span class="chat-box mine">채팅방1 내용</span></li>
</ul>
<div class="input-group">
<input class="form-control" id="chat-input">
<button class="btn btn-secondary" id="send">전송</button>
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</script>
<!-- Optional JavaScript; choose one of the two! --><!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script><script>
const chatRoom = document.querySelectorAll('.list-group-item');
let eventSource;
let chatId;
chatRoom.forEach( i => {
i.addEventListener('click', function() {
chatId = this.dataset.id;
$('.chat-content').html(' ');if (eventSource != undefined) {
eventSource.close()
}eventSource = new EventSource('/message/' + chatId);
eventSource.addEventListener('test', function(e) {
console.log(e)
const getData = JSON.parse(e.data)
getData.forEach( i => {
$('.chat-content').append(<li><span class="chat-box">${i.content}</span></li>
)
});
});
});
});const sendBtn = document.getElementById('send');
sendBtn.addEventListener('click', function(){
const chatContent = document.getElementById('chat-input');
const sendList = {
parent : chatId,
content : chatContent.value
}
console.log(sendList)
$.post('/message', sendList).then(()=> {
console.log("전송 성공")
})
})
</script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
-->
</body>
</html>2022년 4월 25일 04:13 #32464
황현우참가자const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
const { ObjectId } = require('mongodb');function isLogin(req, res, next){
if(req.user) {
next()
} else {
res.send("You are not login")
}
}require('dotenv').config()
// middleware
app.use(session({ secret : "비밀코드", resave : true, saveUninitialized : false }))
app.use(passport.initialize());
app.use(passport.session());app.use(bodyParser.urlencoded({extended : true}));
app.use(methodOverride('_method'));// css middleware연동
app.use(express.static(__dirname + '/public'));// MongoDB연동
let db;
const MongoClient = require('mongodb').MongoClient;
app.set('view engine', 'ejs');
MongoClient.connect(process.env.DB_URL, function(err, client) {
if(err) {
return console.log(err)
}
db = client.db('todoapp')app.listen(process.env.PORT , function(){
console.log("listening on 8080");
});
});app.get('/list', function(req, res) {
db.collection('posts').find().toArray(function(err, result) {
res.render('list.ejs', { posts : result });
});
});app.get('/search', function(req, res) {
const searchCondition = [
{
$search : {
index : 'titleSearch',
text : {
query : req.query.value,
path : "title"
}
}
},
]
db.collection('posts').aggregate(searchCondition).toArray(function(err, result) {
res.render('search.ejs', { posts : result })
})
})app.get('/detail/:id', function(req, res) {
db.collection('posts').findOne({ _id : parseInt(req.params.id)}, function(err, result) {
res.render('detail.ejs', { data : result });
if(result == null) {
res.send("404 Not Found")
}
});
});app.get('/edit/:id', function(req, res) {
db.collection('posts').findOne({ _id : parseInt(req.params.id)}, function(err, result) {
res.render('edit.ejs', { data : result });
if(result == null) {
res.send("404 Not Found")
}
});
});app.put('/edit', function(req, res) {
db.collection('posts').updateOne({ _id : parseInt(req.body.id) }, { $set : { title : req.body.title, date : req.body.date } }, function(err, result){
console.log("수정완료")
res.redirect('/list')
});
});app.get('/', function(req, res){
res.render('index.ejs', {})
});app.get('/write', function(req, res){
res.render('write.ejs', {})
});app.get('/login', function(req, res){
res.render('login.ejs', {})
});app.post('/login', passport.authenticate('local',{ failureRedirect : '/fail'}), function(req, res){
res.redirect('/')
});app.get('/fail', function(req, res){
res.render('fail.ejs', {})
});app.get('/mypage', isLogin, function(req, res){
console.log(req.user)
res.render('mypage.ejs', { user : req.user })
});// 아이디, 비번 검증
passport.use(new LocalStrategy({
usernameField : 'id',
passwordField : 'pw',
session : true,
passReqToCallback : false,
}, function(inputId, inputPw, done) {
console.log(inputId, inputPw, done);
db.collection('login').findOne({ id : inputId }, function(err, result){
if(err) return done(err)
if(!result) return done(null, false, { message : "존재하지 않는 아이디입니다."})
if(inputPw == result.pw) {
return done(null, result)
} else {
return done(null, false, { message : "비밀번호가 틀렸습니다."})
}
})
}));passport.serializeUser(function(user, done){
done(null, user.id)
})passport.deserializeUser(function(userId, done){
db.collection('login').findOne({ id : userId }, function(err, result){
done(null, result)
})
})app.get('/register', function(req, res) {
res.render('register.ejs', {})
})app.post('/register', function(req, res) {
db.collection('login').insertOne({ id : req.body.id, pw : req.body.pw }, function(err, result) {
res.redirect('/')
})
})app.post('/add', function(req, res) {
res.redirect('/list')
db.collection('counter').findOne({name : '게시물갯수'}, function(err, result) {
let totalPost = result.totalPost;
const saveList = { _id : totalPost + 1, writer : req.user._id, title : req.body.title, date : req.body.date }
db.collection('posts').insertOne(saveList, function(err, result){
console.log('저장완료');
db.collection('counter').updateOne({name : '게시물갯수'},{ $inc : { totalPost : 1} },function(err, result){
if (err) {
return console.log(err)
}
console.log(result)
})
});
});
});app.delete('/delete', function(req, res) {
req.body._id = parseInt(req.body._id)
const deleteDate = { _id : req.body._id, writer : req.user._id }
db.collection('posts').deleteOne(deleteDate, function(err, result) {
if (err) {
console.log(err)
}
res.status(200).send({ message : "success" });
});
});app.get('/upload', function(req, res) {
res.render('upload.ejs', {})
})const multer = require('multer');
const storage = multer.diskStorage({
destination : function(req, file, cb) {
cb(null, './public/image')
},
filename : function(req, file, cb) {
cb(null, file.originalname)
}
});
const upload = multer({storage : storage});app.post('/upload', upload.single('profile'), function(req, res) {
res.send("전송완료")
})app.get('/image/:imageName', function(req, res) {
res.sendFile(__dirname + '/public/image/' + req.params.imageName)
})app.get('/chat',isLogin, function(req, res) {
db.collection('chatroom').find({ member : req.user._id }).toArray().then((result)=> {
res.render('chat.ejs', { data : result })
})
})app.post('/chatroom', isLogin, function(req, res) {
const saveList = {
title : "채팅방방",
member : [ObjectId(req.body.user_id), req.user._id],
date : new Date()
}
db.collection('chatroom').insertOne(saveList).then((result)=> {
res.send("채팅방 개설 성공")
})
})app.post('/message', isLogin, function(req, res) {
const saveList = {
parent : ObjectId(req.body.parent),
content : req.body.content,
userid : req.user._id,
date : new Date(),
}
db.collection('message').insertOne(saveList).then(()=> {
console.log("성공")
res.send("DB저장 성공")
}).catch(()=> {
console.log("실패")
})
})app.get('/message/:id', isLogin, function(req, res) {
res.writeHead(200, {
"Connection" : "keep-alive",
"Content-Type" : "text/event-stream; charset=utf-8",
"Cache-Control" : "no-cache",
});
db.collection('message').find({ parent : ObjectId(req.params.id) }).toArray().then( (result)=> {
res.write(event : test\n
);
res.write(data : ${JSON.stringify(result)}\n\n
);
});
const pipeline = [
{ $match : { 'fullDocument.parent' : ObjectId(req.params.id) } }
];
const collection = db.collection('message');
const changeStream = collection.watch(pipeline);
changeStream.on('change', (result)=> {
console.log(result.fullDocument)
res.write(data : ${JSON.stringify([result.fullDocument])} \n\n
);
});
});// router practice
app.use('/shop', require('./routes/shop.js'));
app.use('/board/sub', require('./routes/board.js'));2022년 4월 25일 04:14 #32465
황현우참가자채팅방을 클릭하면 채팅방이 비워지고 이후에 eventSource로직부터 작동이 하지않습니다....
코드는 정상인거 같고 오타도 없는거 같은데 ,, 작동이 되지않네요.. 원인을 도저히 찾을수가 없어서 문의드립니다.
-
글쓴이글
- 답변은 로그인 후 가능합니다.