2016-10-10 28 views
1

Я пытаюсь использовать библиотеку ssh2-sftp для чтения/записи файла в узле. Когда я делаю sftp.get в более крупном CSV-файле (но не слишком большом - например, только 2 МБ) на сайте sftp, а затем читаю данные о возвращенном потоке, звонок висит на мне после 14-го потока. («данные»). Я тестировал это с помощью нескольких разных файлов примеров, и код отлично работает на небольших файлах. Но если файл CSV достаточно велик, чтобы пройти этот 14-й звонок, он просто зависает, и это похоже на то, что он больше не читает, хотя есть еще что читать. И stream.on («close») никогда не включается.Чтение больших файлов sftp с ssh2 sftp Узел

Очевидно, что это довольно странное поведение. Надеюсь, что кто-то столкнулся с чем-то подобным, используя эту библиотеку, и имел некоторые рекомендации.

Если это помогает вообще, вот некоторый код

sftp.get(currentFileName).then((readStream) => { 
    var counter = 0; 

    readStream.on("data", function(d) { 
     counter++; 
     console.log("counter = " + counter); 
    }); 

    readStream.on("close", function(err) { 
     if (err) { 
     console.error("Problem with read stream for file " + currentFileName + ", error = ", err); 
     } 
     //done reading the individual file, all went well 
     else { 
     console.log("done reading the stream"); 
     } 
    }); 

    readStream.on('error', function(e){ 
     console.error("Error retrieving file: " + e); 
    }) 

    readStream.resume(); 

И после того, как 14-го вызова в readStream.on («данные»), он просто замерзает. Возможно, половина файла прочитана.

ответ

1

Проблема оказалась в том, что ssh2-sftp, похоже, использует устаревшую версию базовой библиотеки ssh2. Переключение с ssh2-sftp на самую последнюю (0.5.2) версию ssh2 и использование этой библиотеки непосредственно устранило проблему (которая могла быть такой: https://github.com/mscdex/ssh2/issues/450)