javascript - 使用 connect-form、socket.io 和express 在 node.js 上的行为非常奇怪

标签 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)上,将套接字消息发送到客户端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

感谢您的关注和帮助

最佳答案

您不应该在 progress 事件内监听 socket.io 连接。看起来您正在尝试在用户上传文件时让 socket.io 连接,但这不会这样做。相反,每次上传时触发 progress 事件时,它都会监听新连接,我猜这种情况很常见,这就是为什么您会收到有关监听器过多的警告。

你想要做的是在客户端,当你初始化上传时,通过socket.io告诉服务器。然后服务器通过 session 将 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;
  });
});

然后在你的 route

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

这只适用于每个 session 一次上传,但您明​​白了。

关于javascript - 使用 connect-form、socket.io 和express 在 node.js 上的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8531975/

相关文章:

javascript - MS CRM2013 JavaScript选项问题

javascript - 图像在 document.ready 处没有宽度

javascript - 无法使用 Express NodeJS 和 MongoDB 从 API 检索数据,正在加载

javascript - 将逗号分隔的数字字符串转换为数字

javascript - 一个事件涉及多个元素

javascript - 将项目添加到逗号分隔列表的自定义 Google 表格功能

javascript - 在使用 Node 提取 zip 文件时将流式数据连接到单个文件或字符串中

javascript - 连接来自不同服务器的 socket.io 时出错

javascript - 如何更新子文档并删除子文档中数组的单个对象?

node.js - nodejs 和express 与heroku 我得到了R10