Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript: Node.js
Войти
Регистрация
Восстановить пароль
 
rodigy
85 / 35 / 17
Регистрация: 24.10.2015
Сообщений: 496
1

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

02.06.2018, 23:55. Просмотров 196. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2018, 23:55
Ответы с готовыми решениями:

Выполнение http.request http.get
О задаче: Начну с того что мне нужно сделать, мне нужно получить из формы...

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

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

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

Функция вызывается несколько раз
Всем привет, имеется код: function showEdit(param) // Функция для...

5
Custos
189 / 174 / 30
Регистрация: 23.09.2014
Сообщений: 631
03.06.2018, 14:48 2
Потому, что response - это Stream
0
rodigy
85 / 35 / 17
Регистрация: 24.10.2015
Сообщений: 496
03.06.2018, 20:32  [ТС] 3
Custos, и как правильно делать, писать через стрим?
Можно пример небольшой?
0
Custos
189 / 174 / 30
Регистрация: 23.09.2014
Сообщений: 631
04.06.2018, 08:00 4
rodigy, fs.createWriteStream
0
muxahuk1214
Coding is art
201 / 199 / 67
Регистрация: 04.09.2013
Сообщений: 610
06.06.2018, 20:19 5
Если до сих пор не понятно почему '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
85 / 35 / 17
Регистрация: 24.10.2015
Сообщений: 496
08.06.2018, 23:44  [ТС] 6
Да ясно стало после первого ответа, но все равно всем спасибо)
0
08.06.2018, 23:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2018, 23:44

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

Ajax.ActionLink срабатывает(вызывается) несколько раз подряд
Всем привет! Такая проблема. Есть Ajax хелпер: @Ajax.ActionLink("Remove from...

Почему AuthorizeAttribute каждый раз вызывается дважды?
Привет! Есть свой класс, унаследованный от AuthorizeAttribute, в котором...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru