Итак, в этом (упрощенном) фрагменте кода, когда кто-то попадает на мой сервер узла, я делаю запрос GET на другой веб-сайт и распечатываю заголовок HTML-страницы на консоли. Работает отлично:
var http = require("http");
var cheerio = require('cheerio');
var port = 8081;
s = http.createServer(function (req, res) {
var opts = {
method: 'GET',
port: 80,
hostname: "pwoing.com",
path: "/"
};
http.request(opts, function(response) {
console.log("Content-length: ", response.headers['content-length']);
var str = '';
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function() {
dom = cheerio.load(str);
var title = dom('title');
console.log("PAGE TITLE: ",title.html());
});
}).end();
res.end("Done.");
}).listen(port, '127.0.0.1');
Однако в реальном приложении пользователи могут указать URL-адрес для обращения. Это означает, что мой сервер узла может загружать файлы фильмов размером 20 ГБ или что-то еще. Нехорошо. Заголовок длины содержимого также бесполезен для предотвращения этого, поскольку он передается не всеми серверами. Тогда возникает вопрос:
Как я могу сказать ему, что он должен останавливать запрос GET после того, как, скажем, получены первые 10 КБ?
Ура!
1 ответ
Вы можете прервать запрос, как только прочитаете достаточно данных:
http.request(opts, function(response) {
var request = this;
console.log("Content-length: ", response.headers['content-length']);
var str = '';
response.on('data', function (chunk) {
str += chunk;
if (str.length > 10000)
{
request.abort();
}
});
response.on('end', function() {
console.log('done', str.length);
...
});
}).end();
Это прервет запрос на примерно 10.000 байтах, поскольку данные поступают кусками разного размера.
Похожие вопросы
Связанные вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.