2015-04-30 2 views
1

Я новичок в Node.js.Данные запроса Node.js нарушены

Я получаю данные из некоторых других серверов с помощью Node.js:

function get_data(data_url, a, callback) { 
    console.log('dataurl = ' + data_url); 
    rem_url = url.parse(data_url); 

    console.log('hostname = ' + rem_url.hostname); 
    console.log('host = ' + rem_url.host); 
    console.log('path = ' + rem_url.path); 
    options = { 
     hostname: rem_url.hostname, 
     path: rem_url.path, 
     keepAlive: true 
    }; 

    request = http.request(options, function (res) { 
     data = ''; 
     res.on('data', function (chunk) { 
      data = data + chunk; 
      sleep(20); 
     }); 

     res.on('end', function() { 
      callback(a, data); 
     }); 

     res.on('error', function (err) { 
      console.log("Error Occurred: " + err.message); 
     }); 
    }); 

    request.on('error', function (e) { 
     console.log('dataurl = ' + data_url); 
     console.log('a = ' + a); 
     console.log('problem with request: ' + e.message); 
    }); 

    request.end(); 
} 

я получаю сломанные данные, так что я вставленные функции сна:

res.on('data', function (chunk) { 
    data = data + chunk; 
    sleep(20); 
}); 

Я до сих пор интересно, если есть лучший способ? Большое спасибо!

Примечание: это моя функция сна:

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
     if ((new Date().getTime() - start) > milliseconds){ 
      break; 
     } 
    } 
} 

Подробнее:

  • насчитайте длина данных 5000 ~ 5500 символов от 1 запрос
  • я сделать 500 запросов
  • так общее длина данных составляет 2700285
  • данные кодируются base64
  • без функции сна% 10 данных нарушается
  • со сном (1) сломанные данных уменьшается до% 5
  • со сном (10) сломанные данных уменьшается до% 2
  • сна уменьшается (20) разбитые данные до% 1
  • если я увеличиваю время сна, я получаю лучшие результаты.
+1

Вы создаете глобальное значение с 'data = '';'. Сделайте его локальным с помощью 'var data = '';'. То же самое с 'var request',' var rem_url' и 'var options'. –

+0

Я уже это сделал. но это вне функции. здесь полный код http://pastebin.com/5sgqNJV4 – margarita

+0

wat. Извините, вам действительно нужно разбить это на более мелкие, названные функции, прежде чем я смогу посмотреть на это. –

ответ

1

при чтении ваших кодов я заметил, что даже там одни и те же комментарии, вам нужно установить данные внутри функции не снаружи. , поэтому он становится локальной переменной. в вашей переменной данных функции является глобальной. Потому что вы получаете лучшие результаты с функцией sleep(); javascript нужно некоторое время, чтобы перезаписать глобальные данные. Это объясняет, почему вы получаете лучшие результаты. просто напишите вот так и удалите var data; из верхних строчек файла js.

var data = ''; 
res.on('data', function (chunk) { 
     data = data + chunk; 

}); 
+0

спасибо, что объясните. Это отлично работает сейчас. – margarita

Смежные вопросы