Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577

HTTP request. Почему data вызывается несколько раз?

02.06.2018, 23:55. Показов 1468. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Часть кода
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const http = require('https');
 
let reqOptions = {
    host: 'raw.githubusercontent.com',
    protocol: 'https:',
    path: '/fontello/awesome-uni.font/master/config.yml'
};
 
let callback = function(response) {
 
    response.on('data', function (src) {
        let data = src.toString();
        fs.writeFile('./temp/font.yml', data, function (err) {
            if (err) throw err;
        });
    });
};
 
http.request(reqOptions, callback);
http.on('error', (err) => {console.log(err);});
http.end();
Событие data вызывается несколько раз и в файл пишется не все данные, а только последняя часть, почему так происходит, т.е. почему data вызывается несколько раз?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2018, 23:55
Ответы с готовыми решениями:

Ошибки Synapse (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too Large)
Добрый день. При работе с Synapse начали возникать вот такие вот две ошибки (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too...

Есть ли инструмент в google chrome для поиска по request.data значению по всем http запросам?
Добрый день, Сайт видимо на ASP.NET Есть задача найти http запрос среди огромного кол-ва. Алгоритм был такой: На сайте...

Почему функция вызывается один раз, а не бесконечное число раз
Программа показывает, как работать с анимацией цвета. Мы берём случайный цвет и медленно изменяем его на другой случайный. Я объявляю...

5
Software Engineer
 Аватар для Custos
332 / 336 / 55
Регистрация: 23.09.2014
Сообщений: 999
03.06.2018, 14:48
Потому, что response - это Stream
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
03.06.2018, 20:32  [ТС]
Custos, и как правильно делать, писать через стрим?
Можно пример небольшой?
0
Software Engineer
 Аватар для Custos
332 / 336 / 55
Регистрация: 23.09.2014
Сообщений: 999
04.06.2018, 08:00
rodigy, fs.createWriteStream
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
06.06.2018, 20:19
Если до сих пор не понятно почему 'data' вызывается несколько раз:

Как уже заметили в комментариях request это стрим (Stream), что значит, что он может принимать (читать) данные на протяжении какого-то времени (пусть будет 10 сек. для примера).
Суть стримов в том, что они читают (или пишут) данные не все сразу, а по частям (т.е. если у вас текст длиной в 1000 символов, стрим может (тут нужно смотреть конкретную имплементацию разных стримов) читать 100 символов за раз (как пример).
Каждый раз когда он прочитал 100 символов Стрим отправит событие 'data' с этими 100 символами.
После того, как чтение завершено (что в нашем примере произойдет через 10 сек.) Стрим отправит событие 'end' что значит что больше нечего читать.
На практике, что бы получить все 1000 символов в 1-у переменную Вам нужно будет сделать что-то типо:
JavaScript
1
2
3
4
5
6
let string = '';
stream.on('data', (chunk) = string += chunk);
stream.on('end', () => {
  console.log(string);
  // в этот момент времени мы полностью закончили читать стрим и имеем все 1000 символов в переменной string
});
В частности в Вашем случае, т.к. вы хотите сохранить данные в файл, вы можете воспользоваться стримом файловой системы, которые идёт в "комплекте" с nodejs.
Что для этого нужно:
1. создать стрим с нужным файлом (т.е. грубо говоря присоедениться к файлу)
1.1 место где создавать (скоуп) зависит от того, хотите ли вы сохранять всё в 1 файл или разные
1.1.1 т.е. если 1-н файл то открываете "соединение" вне колбэка, что бы не делать это каждый раз
1.1.2 или в нутри колбека, если файлы разные (динамические названия и т.п.)
2. воспользоваться АПИ которое предоставляет nodejs (pipe) что бы передать данные из одного стрима в другой
JavaScript
1
2
3
4
5
const fs = require('fs');
const fileWriteStream = fs.createWriteStream('./my-file.txt');
const callback = (req) => {
  req.pipe(fileWriteStream);
};
Единственный минус о котором я могу догадаться (и не знаю правда это или нет):
Если вы будете делать много запросов одновременно и все они будут паралельно выполнятся, то может произзойти ситуация, когда req1 запишет chunk в файл, затем req2 запишет и затем опять req1 запишет..
т.е. т.к. req отправляет 'data' асинхронно, то в файле могут быть перемешаны строки из разных req.

Если такое возможно (и если это так на самом деле происходит, напомню что я не тестировал), то пофиксить это можно комбинацией 2-х примеров:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require('fs');
const fileWriteStream = fs.createWriteStream('./my-file.txt');
fileWriteStream.on('error', console.error);
let toWrite = [];
setInterval(() => {
  if (toWrite.length === 0) return;
  toWrite.forEach(liens => {
    liens.forEach(line => {
      fileWriteStream.write(line);
    });
  });
  toWrite = [];
}, 1000);
const callback = (req) => {
  let lines = [];
  req.on('data', lines.push);
  req.on('error', (e) => lines = [e]);
  req.on('end', () => {
    toWrite.push(lines);
  });
};
(пример корявый но думаю понятно что я пытался сделать)
1
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
08.06.2018, 23:44  [ТС]
Да ясно стало после первого ответа, но все равно всем спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2018, 23:44
Помогаю со студенческими работами здесь

Событие вызывается несколько раз
Второй день, как стал изучать JavaScript. Пишу функцию, которая формирует список папок и файлов из заранее полученных данных. на...

Функция вызывается несколько раз
Есть код anti-CSRF: <?php class Security { public function __construct() { $this->log = new log; } private...

Функция вызывается несколько раз
Всем привет, имеется код: function showEdit(param) // Функция для отображения редактируемого поля { x = param.id.replace(//ig,...

Метод paintComponent() вызывается несколько раз
Три раза подряд вызывается метод paintComponent() import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; ...

Ajax.ActionLink срабатывает(вызывается) несколько раз подряд
Всем привет! Такая проблема. Есть Ajax хелпер: @Ajax.ActionLink("Remove from friends", "RemoveFriend", new { id = friend.Id }, new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru