NodeJS 0.10。 net.Socket上没有发出'data'事件

时间:2014-01-11 17:47:03

标签: node.js sockets eventemitter

我有代码在套接字级别记录我的HTTP服务器的每个连接,并记录任何传入的数据。

此代码最初是为NodeJS 0.8编写的,在那里运行良好。

我的项目没有迁移到0.10.24,套接字日志代码停止工作。

这是我的代码:

var netLogStream = fs.createWriteStream('net.log');

(function(f) {
    net.Server.prototype.listen = function(port) {
        var rv = f.apply(this, arguments); // (1)
        rv.on('connection', function(socket) { // (2)
            socket.on('data', function(data) {
                data.toString().split('\n').forEach(function(line) { // (3)
                    netLogStream.write('... some logging here ... ' + line);
                });
            });
        });
        return rv;
    };
})(net.Server.prototype.listen);

在0.10上,我可以到(1)并在Socket上获得(2)个实例,但我从未到达(3)。同时我的整个应用程序运行正常,没有任何问题。

ADD :我的服务器是使用Express@3.4.x创建的

1 个答案:

答案 0 :(得分:1)

我不确定为什么节点v0.8和v0.10之间的结果有所不同,但如果我不得不猜测,我会查看net.Server.prototype.listen的返回值。

根据documentation,这是一个异步方法,它发出'listen'事件并在绑定侦听时调用其回调。你不是在寻找那个事件,而是捕获listen的返回值,对于异步函数,它可能没有明确定义。它显然不是nullundefined,因为您没有收到运行时错误,但v0.8和v0.10之间的返回值可能不同。

老实说,我不确定,因为我不做低级套接字编码,但我有2个建议可以尝试:

  1. 由于从connection对象发出Server事件,您可能需要this.on而不是rv.on
  2. 在调用connection之前设置listen事件侦听器,以最大程度地降低竞争条件的风险。
  3. 试试这个,看看会发生什么:

    var netLogStream = fs.createWriteStream('net.log');
    
    (function(f) {
        net.Server.prototype.listen = function(port) {
            this.on('connection', function(socket) { // (2)
                socket.on('data', function(data) {
                    data.toString().split('\n').forEach(function(line) { // (3)
                        netLogStream.write('... some logging here ... ' + line);
                    });
                });
            });
            return f.apply(this, arguments); // (1)
        };
    })(net.Server.prototype.listen);