5

我正在 node.js 中构建一个应用程序,它加载几个页面并分析内容。

因为 node.js 发送块我可以分析块。如果一个块包含例如索引,nofollow 我想关闭该连接并继续其余的。

var host  = 'example.com',
    total = '',
    http  = require('http');

var req = http.request({hostname: host, port: 80, path: '/'}, function(res) {
    res.on('data', function(chunk) {
        total += chunk;
        if(chunk.toString().indexOf('index,nofollow') == -1) {
            // do stuff
        } else {
            /*
             * WHAT TO DO HERE???
             * how to close this res/req?
             * close this request (goto res.end or req.end????
             */
        }
    }).on('end', function() {
        // do stuff
    });
}).on('error', function(e) {
    // do stuff
    console.log("Got error: " + e.message);
});

我唯一想不通的是退出该连接。或者停止检索数据,因为我不需要它..

req.end(); 不起作用..它继续检索数据/块..(在我的测试中我得到14个块,但在第一个块中我已经知道我不需要其他块,所以我想退出请求/回复)。

我现在有一个跳过分析其他块的布尔值,但在我看来,我最好跳过检索数据?

调用什么函数?还是因为它需要检索所有内容而不可能?

4

1 回答 1

2

我还没有测试它,把它放在你的else块中应该可以工作:res.removeAllListeners('data');

基本上你resEventEmitter对象的孩子。通过调用removeAllListeners('data')它,所有绑定到data事件的处理程序将被删除,回调将不再执行。但是您仍然必须等待所有数据事件通过之前enderror在请求上发出事件。

另请阅读 nodejs EventEmitter 文档以获取更多信息。

更新:

您不妨尝试在 else 块中的对象上发出endclose事件,如下所示:或. 关于 event 的 clientRespone对象的文档说它是resres.emit('end');res.emit('close');end

每个响应只发出一次。之后,响应中将不再发出“数据”事件。

于 2013-01-22T13:39:35.423 回答