以下代码:
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
感谢您的关注和帮助
答案 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);
}
});
这仅适用于每个会话一次上传,但您明白了。