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

home2 게시판 Node.js, Express 게시판 EventSource's response has a MIME type 오류

EventSource's response has a MIME type 오류

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

    황현우
    참가자

    해당 오류로 인해서 eventSource가 작동되지 않아서 채팅기능이 구현되지않습니다..

    #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>

    #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'));

    #32465

    황현우
    참가자

    채팅방을 클릭하면 채팅방이 비워지고 이후에 eventSource로직부터 작동이 하지않습니다....

    코드는 정상인거 같고 오타도 없는거 같은데 ,, 작동이 되지않네요.. 원인을 도저히 찾을수가 없어서 문의드립니다.

     

    #32469

    codingapple
    키 마스터

    event : 이걸 event: 이런식으로 다 바꿔봅시다 

    #32505

    황현우
    참가자

    와 ..대박 해결되었습니다... 감사합니다.. 그런데 왜?? 그런거죠 ? 단순히 띄어쓰기 때문에 코드가 작동이 안하는건가요 ?

    #32536

    codingapple
    키 마스터

    네 정확한 규격이 있어서 그런가봅니다 

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 호 / 개인정보관리자 : 박종흠