【问题标题】:NodeJS 0.10. No 'data' event emitted on net.Socket节点JS 0.10。 net.Socket 上没有发出“数据”事件
【发布时间】:2014-01-11 17:47:03
【问题描述】:

我有代码可以在套接字级别记录到我的 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) 上获得 Socket 实例,但我永远无法访问 (3)。同时我的整个应用程序运行良好,没有任何问题。

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

【问题讨论】:

  • 你没有在听“听”事件(双关语不是故意的)。
  • @Brandon 为什么我应该这样做?
  • 请注意,底层流从 0.8->0.10 发生了很大变化。请参阅:blog.nodejs.org/2012/12/20/streams2 我还不能完全确定您是否需要额外的处理程序与您现在拥有的处理程序,但我会仔细研究一下。
  • @Joe rv 是 return value。我确定这是net.Server (this),但现在在文档中找不到任何证据...
  • 它实际上在 0.10.24 中对我来说似乎工作正常(尽管我正在通过写入标准输出而不是文件进行测试,也许有一些缓冲正在进行?)。你如何测试它是否工作? (gist)。

标签: node.js sockets eventemitter


【解决方案1】:

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

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

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

  1. 由于connection 事件是从Server 对象发出的,也许您需要this.on 而不是rv.on。
  2. 在调用 listen 之前设置 connection 事件侦听器,以最大限度地降低竞争条件的风险。

试试这个,看看会发生什么:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2021-03-22
    • 2019-12-07
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多