Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs0.10。否';数据';在net.Socket上发出的事件_Node.js_Sockets_Eventemitter - Fatal编程技术网

Node.js nodejs0.10。否';数据';在net.Socket上发出的事件

Node.js nodejs0.10。否';数据';在net.Socket上发出的事件,node.js,sockets,eventemitter,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.a

我有代码在套接字级别上记录到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)
并在
(2)
上访问
套接字
实例,但我从未访问过
(3)
。同时,我的整个应用程序运行良好,没有任何问题


添加:我的服务器是用Express@3.4.x

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

根据,这是一个异步方法,它发出“listen”事件,并在绑定侦听时调用其回调。您不是在寻找那个事件,而是捕获listen的返回值,对于异步函数来说,它可能没有很好的定义。它显然不是
null
undefined
,因为您没有得到运行时错误,但是返回值在v0.8和v0.10之间可能不相同

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

  • 由于
    连接
    事件是从
    服务器
    对象发出的,因此您可能需要
    this.on
    而不是
    rv.on
  • 在调用
    listen
    之前,先设置
    连接
    事件侦听器,以便将竞争条件的风险降至最低
  • 试试这个,看看会发生什么:

    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);
    

    你没有在听“listen”事件(不是有意的双关语)。@Brandon我为什么要听?请注意,底层流从0.8->0.10发生了很大变化。请看:我还不能确定您是否需要一个额外的处理程序与您现在拥有的处理程序相比,但我会仔细研究一下。@Joe
    rv
    is
    返回值
    。我确信这是一个
    net.Server
    this
    ),但现在在文档中找不到任何证据…在0.10.24中,它实际上似乎对我来说工作正常(尽管我正在通过写入标准输出而不是文件进行测试,也许有一些缓冲在进行?)。你如何测试它是否工作?().