2017-09-30 13 views
0

데이터 변경시보기를 업데이트해야하는 웹 앱을 구축 중입니다. 이 목적을 위해 나는 socket.io를 사용하고있다. 내 콘솔에 보면소켓이 경로 내에서 방출되지 않습니다.

const io = require('socket.io')(http); 

/* WEB SOCKET INITIALISATION 
----------------------------------------- */ 
io.on('connection', function(socket) { 
    io.emit('new connection', 'new connection'); 

    socket.on('disconnect', function() { 
    io.emit('offline', 'offline') 
    }); 
}); 

, 그것은 곧 내가 페이지에있어로의에게 '새 연결'로그 :이 server.js 파일의 설정입니다. 이제 내가 만든 경로 중 하나에서 소켓을 사용하고 싶습니다. 이것이 가능하려면 나는이 같은 경로를 필요로하는 곳으로 io 바인딩 :

const dashboardRouter = require('./routes/dashboard')(io); 

이 경로의 일부의 모습처럼 :

/* MAKE SOCKET.IO ACCESSABLE 
--------------------------------------------------------------- */ 
module.exports = function(io) { 

    /* INDEX ROUTE 
    -------------------------------------------------------------- */ 
    router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) { 
    io.emit('update', 'testen'); 
    res.locals.username = req.session.username; 
    res.render('dashboard/index'); 
    }); 

    /* EXPORT ROUTER 
    --------------------------------------------------------------- */ 
    return router; 

} 

문제는 때 I 업데이트를 내 보내면 콘솔에 로그인하지 않습니다. 내가 경로 내에 console.log(io)을하면, socket.io를 사용할 수있는 것처럼 보입니다. 터미널 콘솔 내부에 오류가 없습니다. 내가 잘못 여기서 뭐하는 거지

(function() { 

    const socket = io(); 

    socket.on('update', function(data) { 
    console.log('Works'); 
    }); 

    socket.on('new connection', function(data) { 
    console.log(data); 
    }); 

}()); 

:

이 자바 스크립트 파일을 클라이언트 측의 모습인가? 소켓이 메시지를 내보내는 것을 어떻게 확인할 수 있습니까? 누군가가 나를 도와 줄 수 있기를 바랍니다!

미리 감사드립니다.

+0

나는이 권리를 얻고 있는지 잘 모르겠다. 하지만 페이지/경로가로드되는 동안 웹 소켓에 연결되어 있지 않습니다. 방출 되더라도'io.emit'가 호출 된 후에 페이지가로드되기 때문에 그것을 볼 수 없습니다. 아니면 '대시 보드'경로로 AJAX 호출을하고 있습니까? –

답변

1

이 경로 :

router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) { 
    io.emit('update', 'testen'); 
    res.locals.username = req.session.username; 
    res.render('dashboard/index'); 
    }); 

모든 연결된 다른 페이지에 방송되지만,이 경로를 트리거 한 특정 사용자에 대한 아무것도 표시되지 않습니다. 이 경로를 실행 한 사용자가 페이지를 요청하고로드하는 중이고 아직 socket.io에 연결되어 있지 않기 때문입니다.

  1. 브라우저 socket.io를 분리하고 자바 스크립트를 종료 포함 이전 웹 페이지를 닫습니다 다음과 같이

    이 요청을 한 사용자에 대한 작업의 순서는 다음과 같습니다.

  2. 브라우저 요청 / URL.
  3. 서버가 해당 URL에 대한 경로 처리기를 호출합니다.
  4. 경로 처리기가 현재 연결된 모든 클라이언트에게 보내는 io.emit()을 호출하지만이 요청을하는 클라이언트는 현재 연결되어 있지 않습니다.
  5. 경로 처리기가 페이지를 렌더링하고 브라우저로 다시 보냅니다.
  6. 브라우저가 페이지를 받아 렌더링합니다.
  7. 브라우저가 페이지에서 자바 스크립트를 실행하여 socket.io 연결이 이루어집니다. 이 순서에서 볼 수 있듯이 당신이 io.emit()를 호출 할 때

가 요청하는 브라우저가 socket.io와 연결되어 있지 않습니다. 기본적으로 렌더링되는 동일한 경로에서 렌더링되는 페이지로 보낼 수 없습니다.

+0

답변을 주셔서 감사합니다. 명확한 방법으로 이해하는 데 약간의 시간이 걸렸지 만, 일부 게임, 테스트 및 디버깅 후에 나는 흐름을 잘 이해하여 문제를 해결했습니다! –