2017-10-28 3 views
0

익스프레스 생성기를 사용하여 노드 앱을 만들었습니다. 나는 응용 프로그램에 socket.io를 통합했습니다. 익스프레스 생성기는 익스프레스 서버를 생성하는 고유의 방법을 가지고 있기 때문에 this procedure을 따라 Socket 연결을 리스닝 서버와 성공적으로 통합하고 res.io 인스턴스를 통해 응용 프로그램 전체에서 io를 사용할 수있게했습니다.Express-generator, Socket.io 여러 번 발행하는 이벤트

FILE : 빈/WWW

#!/usr/bin/env node 
var app = require('../app').app; 
var debug = require('debug')('www:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 

/** 
* Create HTTP server. 
*/ 

var server = require('../app').server; 

/app.js

//Express handler 
var app = express(); 
// Socket configuration 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
app.use(function(req, res, next){ 
    res.io = io; 
    next(); 
}); 

... 

module.exports = {app: app, server: server}; 

하지만 아래와 같이 나 이벤트를 방출하고있어 때 문제가된다. 내 고객이 데이터를 여러 번 읽는 중입니다.

루트 /하는 index.js

var clients = 0; 
    var nsp = res.io.of('/default-namespace'); 
    nsp.on('connection', function (socket) { 
     clients++; 
     console.log(clients + ' clients connected!'); 
     socket.on('disconnect', (reason) => { 
     clients--; 
     console.log(clients + ' clients connected!'); 
     }); 
     nsp.emit("socketToMe", "New User connected. Current clients:"+ clients); 
    }); 

내 청취자가 다음 코드를 home.pug 난 내 주요 incoginito 같은 다른 인스턴스에 브라우저를 새로 고침 할 때마다

var socket = io('/default-namespace'); 
socket.on('socketToMe', function (data) { 
    $('#data-div').append($('<li>').text(data)); 
    }); 

브라우저가 데이터에 대해 여러 이벤트를 표시하고 있습니다. 이와 같이

New User connected. Current clients:1 
New User connected. Current clients:2 
New User connected. Current clients:1 
New User connected. Current clients:2 
New User connected. Current clients:1 
New User connected. Current clients:1 

무엇이 잘못 되었나요? 아무도 이것에 나를 도울 수 있습니까?

답변

0

노드는 이벤트 구동입니다. res 개체는 전역 변수가 아닙니다. 모든 요청에 ​​대해 Express 미들웨어가 실행됩니다.

var clients = 0; 
    var nsp = res.io.of('/default-namespace'); 
    nsp.on('connection', function (socket) { 
    clients++; 
    console.log(clients + ' clients connected!'); 
    socket.on('disconnect', (reason) => { 
    clients--; 
    console.log(clients + ' clients connected!'); 
    }); 
    nsp.emit("socketToMe", "New User connected. Current 
    clients:"+clients); 
    }); 

날 above.A 사용자 요청을 발생하고 REQ 핸들러가 실행되는 것을 설명하게 당신은 고해상도에게 개체에 액세스하면 이벤트를 수신. 그래서 각 요청에 대해, 당신은 소켓 '연결'을 수신하는 event.That은 당신이 새로운 리스너을 설정 여러 이벤트 리스너는 요청을 같은 name.Every 시간을 설정하는 것을 의미한다.

'연결'수신기 만 설정해야합니다.

동일한 이벤트가 여러 번 발생하는 경우를 설명합니다.

app.use(function(req, res, next){ 
res.io = io; 
next(); 
}); 

대신 위의 미들웨어 기능을 사용하는

+0

가 완벽하게 작동 예를 IO 직접들을 수 있습니다. nsp.on을 추가하는 대신 ('연결' , 단순히 nsp.emit –