Node.js:如何在检索数据时关闭响应/请求(chuncks)

Fer*_*bus 5 javascript node.js

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

因为node.js发送块我可以分析块.如果一个块包含例如index,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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

要叫什么功能?或者它是不可能的,因为它需要检索一切?

Juz*_*Ali 2

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

基本上你res是 Object 的孩子EventEmitter。通过调用removeAllListeners('data')它,所有绑定到data事件的处理程序都将被删除,并且回调将不再执行。但您仍然需要等待所有数据事件通过end,或者error根据请求发出事件。

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

更新:

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

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