node.js上使用connect-form,socket.io和express的奇怪行为

时间:2011-12-16 09:11:49

标签: javascript node.js express 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)上的

将socket消息发送到客户端js,但它显然创建了大量的侦听器,实际上它警告我说: “node”警告:检测到可能的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

感谢您的关注和帮助

1 个答案:

答案 0 :(得分:0)

您不应该在progress事件中侦听socket.io连接。看起来你正试图让socket.io在用户上传文件时进行连接,但这样做不会。相反,每当progress事件触发上传时,它都会侦听一个新的连接,我猜这很常见,这就是为什么你会收到关于太多听众的警告。

您要做的是在客户端,当您初始化上载时,通过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);
  }
});

这仅适用于每个会话一次上传,但您明​​白了。