2017-12-12 14 views
0

그래서 싱글 톤 패턴을 사용하여 websocket을 설정하고 있습니다. Client Side에서 Node.js의 Socket.io를 사용하여 routes 파일을 내보내는 방법

var sio = require('socket.io') 
var io = null; 

exports.io = function() { 
    var socket; 
    if(io === null){ // Initialise if not already made 
    io = initialize(server); 
    } 
    return io; 
}; 

exports.initialize = function(server) { 

    io = sio.listen(server); 
    var connections = []; 

    console.log('IO Initialized!\n') 

    io.on('connection', function(socket){ 
    connections.push(socket); 
    console.log('Connected: %s sockets connected', connections.length); 

    socket.on('disconnect', function(data){ 
     connections.splice(connections.indexOf(socket), 1); 
     console.log('Disconnected: %s sockets connected', connections.length); 
    }); 

    // Update function used to send messages to and from backend 
    socket.on('update', function(data){ 
     io.sockets.emit('new message', {msg: data}); 
    }); 


    }); 

}; 

그리고 내 자바 스크립트/공공 파일에 내가 경로 파일에서 성공적으로 방출 할 수있다

router.use(function(req, res, next){ 
    if(socket === undefined){ 
     socket = io.io(); 
    } 
    next(); 
}); 

router.get('/', function(req, res, next){ 


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

    socket.emit('update', 'leaving routes'); 
}); 

내가 가진 너무

$(function(){ 

    var socket = io.connect(); 
    socket.emit('update', 'Test Update'); 
    socket.on('update', function(data){ 
     console.log('here: ' + data); 
    }); 
}); 

처럼 내 경로 파일에 다음을 호출 할 수 있습니다 공개 js 파일 (백엔드에서 프론트 엔드로). 그러나 공용 js 파일에서 라우트 파일로 정보를 보낼 수는 없으며 싱글 톤 패턴 js 파일로만 보냅니다. 대신 경로 파일로 보내려면 어떻게해야합니까? 내가이 일을 잘못한다면 경로와 공개 js 파일 사이의 의사 소통 방법에 대한 exapmle을 제공해 줄 수 있습니까?

+0

'소켓'이 무엇인지 오해하고있는 것을 알 수 있습니다. 들어오는 클라이언트 연결마다 고유 한 개체입니다. 그것은 싱글 톤이 아닙니다. 당신은 단지 글로벌이라고 부를 수 없습니다. 사실, 당신이 실제로 사용할 수있는 유일한 곳은'io.on ('connection', ....) 핸들러 내부입니다. 왜냐하면 그것이 새로운 각'socket' 객체에 연결을 제공하기 때문입니다. 경로에서 수행하려는 작업이 그 순간에 요청을하는 특정 사용자의 소켓 객체에 액세스하는 것이라면 이는 완전히 다른 질문이며이를 탐구하는 다른 많은 대답이 있습니다. – jfriend00

+0

"express socket.io connection in express route"를 검색하여 찾고자하는 것을 찾으십시오. 이 두 가지를 연결하는 일반적인 방법은 세션 객체를 통해 이루어지며 socket.io 연결이 연결될 때 세션에서 초기화를 수행하여 나중에 경로에서 소켓에서 소켓 .id에 액세스 할 수 있습니다. 당신은 소켓 객체를 얻을 수있다. – jfriend00

답변

0

내가 말할 수있는 한, 귀하의 싱글 톤 설정에는 아무런 문제가 없습니다.

, 이벤트 수신 대기중인 모든 장소는 io.on('connection', ...)으로 묶어야합니다. 이것을 싱글 톤으로 설정해도 이것이 요구되는 것을 막을 수는 없습니다.

편집 : 여기에 잘못되었습니다. exports.initialize이 실제로는 connections을 반환하지 않는 것으로 나타났습니다. 그걸 시험해 봤어?