2011-12-16 36 views
1

下面的代碼node.js的真正奇怪的行爲:使用連接形式,socket.io並表達

req.form.on('progress', function(bytesReceived, bytesExpected){ 
    var percent = (bytesReceived/bytesExpected * 100) | 0; 
    // progressEvent.download(percent); 

    io.sockets.on('connection', function (socket) {   
     socket.emit('progress', { percent: percent}); 
     client = socket; 
     });   
    }); 

寫在一個HTTP POST處理器(express.js)發送套接字消息給客戶端的js,但它顯然創造了大量的聽衆,實際上它警告我說: 「節點)警告:可能的EventEmitter內存泄漏檢測,添加了11個偵聽器,使用emitter.setMaxListeners()來增加限制。

,從另一方面驗證碼:

io.sockets.on('connection', function (socket) { 
    progressEvent.on('progress', function(percentage) { 
    console.log(percentage); 
    socket.emit('progress', { percent: percentage}); 
    }); 
}); 

不發送任何消息返回到客戶端,ProgressEvent是:

var util = require('util'), 
    events = require('events'); 

function ProgressEvent() { 
    if(false === (this instanceof ProgressEvent)) { 
     return new ProgressEvent(); 
    } 

    events.EventEmitter.call(this); 
} 

util.inherits(ProgressEvent,events.EventEmitter) ;

ProgressEvent.prototype.download = function(percentage) { 
    var self = this; 
    self.emit('progress', percentage);  
} 

exports.ProgressEvent = ProgressEvent; 

我一直對這個奇怪的問題很好,我真的不明白爲什麼socket.io不會發送套接字消息到客戶端。

整個項目是在這裏:https://github.com/aterreno/superuploader

感謝您的關注&幫助

回答

0

你不應該聽socket.io的progress事件的內部關係。它看起來像是在用戶上傳文件時試圖讓socket.io連接,但那不會。相反,它會在每次上傳時觸發一個新的連接,我猜這很常見,這就是爲什麼你會收到太多聽衆的警告。

你想要做的是在客戶端,當你初始化上傳時,通過socket.io告訴服務器。然後服務器銜接是通過他們自己的會議上傳,socket.io客戶http://www.danielbaulig.de/socket-ioexpress/

像這樣的事情應該去做

io.sockets.on('connection', function(socket) { 
    var session = socket.handshake.session; 

    socket.on('initUpload', function() { 
    session.socket = socket; 
    }); 

    socket.on('disconnect', function() { 
    session.socket = null; 
    }); 
}); 

,然後在路線

req.form.on('progress', function(bytesReceived, bytesExpected){ 
    var percent = (bytesReceived/bytesExpected * 100) | 0; 
    if (req.session.socket) { 
    socket.emit('progress', percent); 
    } 
}); 

這隻能每個會話一次上傳,但你明白了。

+0

感謝您的回覆,我嚴格遵循您提供的鏈接上的代碼,並使用普通的server.send>客戶端發送回服務器一切正常,但不是在郵件處理程序。 代碼現在在這裏:https://github.com/aterreno/socket-node-sessions 特別是在這個文件中:https://raw.github.com/aterreno/socket-node-sessions/master/ app.js 你認爲我應該有一個iframe來處理套接字通信嗎? 似乎只是錯... 再次感謝。 – 2011-12-19 14:46:13