我有代码在套接字级别记录我的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创建的
答案 0 :(得分:1)
我不确定为什么节点v0.8和v0.10之间的结果有所不同,但如果我不得不猜测,我会查看net.Server.prototype.listen
的返回值。
根据documentation,这是一个异步方法,它发出'listen'事件并在绑定侦听时调用其回调。你不是在寻找那个事件,而是捕获listen的返回值,对于异步函数,它可能没有明确定义。它显然不是null
或undefined
,因为您没有收到运行时错误,但v0.8和v0.10之间的返回值可能不同。
老实说,我不确定,因为我不做低级套接字编码,但我有2个建议可以尝试:
connection
对象发出Server
事件,您可能需要this.on
而不是rv.on
。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);