3

我有代码可以在套接字级别记录到我的 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 创建的

4

1 回答 1

1

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

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

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

  1. 由于connection事件是从Server对象发出的,因此您可能需要this.on代替rv.on.
  2. connection在调用之前设置事件侦听器,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);
于 2014-01-11T18:18:53.240 回答