当累计块的大小大于阈值时如何结束http响应stream

我试图从url列表中下载一些文件,但是我不想下载任何超过一定大小的文件(比如说1mb)。 这些文件可能是千兆字节,所以我需要一种方法来取消下载响应stream增长大于1mb。

let request = require("request"); function getFile(url, callback) { request.get(url) .on('response', function(response) { let output = ""; response.on('data', function(chunk) { if(output.length > 1000000) { // ??? ABORT STREAM HERE ??? console.log(`${url} is too big`); callback(true); } else { output += chunk.toString("utf8"); } }); response.on('end', function() { console.log(`${url} download complete`); callback(null, output); }); }); } 

我不知道如何实现这一点。 这个请求库的github问题是关于中止请求的,但是我认为我想中止实际的http响应stream而不是请求。 在这里也有类似的问题,但答复者似乎认为这是不可能的。 我确定这不是真的(或者我错误地解释了他们的答案),否则我将不得不下载我遇到的每个10gig文件。

是否像删除dataend事件监听器一样简单? 直觉上,我猜测下载是否继续有事件发生,但是我真的不知道它是如何在幕后工作的。 感谢您的任何帮助,您可以提供!

我玩了更多的事情,事实certificate, request包的.abort()方法取消了http响应stream。

我希望有一个更通用的方法来取消一个不依赖于请求包的http响应stream,但是这将做我的目的,因为我目前正在使用请求库。

 let request = require("request"); function getFile(url, callback) { let tooBig = false; let r = request.get(url) .on('error', callback) .on('response', function(response) { let output = ""; response.on('error', function(error) { callback(error, null); }); response.on('data', function(chunk) { if(output.length > 1000000) { tooBig = true; r.abort(); } else { output += chunk.toString("utf8"); } }); response.on('end', function() { if(tooBig) { console.log(`${url} was too big`); callback("too big", null); } else { console.log(`${url} download complete`); callback(null, output); } }); }); } 

另外,如果你正在使用请求库,事情就会变得更加简单:

 function getFileSimplified(url, callback) { let output = ""; let tooBig = false; let r = request.get(url) .on('error', callback) .on('data', function(chunk) { if(output.length > 1000000) { tooBig = true; r.abort(); } else { output += chunk.toString("utf8"); } }) .on('end', function() { if(tooBig) { console.log(`${url} was too big`); callback("too big", null); } else { console.log(`${url} download complete`); callback(null, output); } }) } 

希望能帮助遇到类似问题的人。 我不打算接受这个答案,因为问题的正确答案不应该依赖于npm请求包。 如果有人知道如何做,请张贴另一个答案,我会接受。