以下代码:
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/