Node.js 当累积块的大小大于阈值时,如何结束http响应流
我试图从URL列表中下载一些文件,但我不想下载任何超过一定大小(比如1mb)的文件。这些文件可能是千兆字节,所以我需要一种方法,在响应流增长超过1mb时立即取消下载Node.js 当累积块的大小大于阈值时,如何结束http响应流,node.js,http,request,Node.js,Http,Request,我试图从URL列表中下载一些文件,但我不想下载任何超过一定大小(比如1mb)的文件。这些文件可能是千兆字节,所以我需要一种方法,在响应流增长超过1mb时立即取消下载 let request = require("request"); function getFile(url, callback) { request.get(url) .on('response', function(response) { let output = ""; response.on('dat
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);
});
});
}
我不知道如何才能做到这一点。谈到中止请求,但我认为我希望中止实际的http响应流,而不是请求。有人问了一个类似的问题,但回答者似乎暗示这是不可能的。我肯定这不是真的(或者我误解了他们的答案),否则我会被迫下载我遇到的每一个10gig文件
它是否像删除
数据
和结束
事件侦听器那样简单?直觉上,我猜无论是否附加了事件,下载都会继续,但我真的不知道它在幕后是如何工作的。谢谢你能提供的任何帮助 我对此做了更多的研究,结果是请求
包的abort()
方法确实取消了http响应流
我希望有一种更通用的方法来取消一个不依赖于请求包的http响应流,但是出于我的目的,这就可以了,因为我目前正在使用请求库
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请求包。如果有人知道怎么做,请另发一个答案,我会接受。一旦你知道尺寸,我想你可以轻松取消它