обратный вызов для обработки завершения трубы

Я использую следующий код node.js для загрузки документов с некоторого URL-адреса и сохранения его на диске. Я хочу получать информацию о том, когда документ будет загружен. я не видел никакого обратного вызова с pipe.Or, есть ли какое-либо событие «end», которое можно захватить при завершении загрузки?

request(some_url_doc).pipe(fs.createWriteStream('xyz.doc')); 

Потоки – EventEmitter поэтому вы можете прослушивать определенные события. Как вы сказали, есть finish событие для запроса (ранее end ).

  var stream = request(...).pipe(...); stream.on('finish', function () { ... }); 

Для получения дополнительной информации о том, какие события доступны, вы можете проверить страницу документации streamа .

На основе документа nodejs, http://nodejs.org/api/stream.html#stream_event_finish , он должен обработать событие записи writeableStream.

 var writable = getWriteable(); var readable = getReadable(); readable.pipe(writable); writable.on('finish', function(){ ... }); 

Фрагмент кода для конвейерного контента из сети через http (s) в файловую систему. Поскольку @starbeamrainbowlabs заметил finish события, делает работу

 var tmpFile = "/tmp/somefilename.doc"; var ws = fs.createWriteStream(tmpFile); ws.on('finish', function() { // pipe done here, do something with file }); var client = url.slice(0, 5) === 'https' ? https : http; client.get(url, function(response) { return response.pipe(ws); }); 

Я нашел немного другое решение моей проблемы в отношении этого контекста. Мысль стоит делиться.

В большинстве примеров создаются readStreams из файла. Но в моем случае readStream должен быть создан из строки JSON исходящей из пула сообщений.

 var jsonStream = through2.obj(function(chunk, encoding, callback) { this.push(JSON.stringify(chunk, null, 4) + '\n'); callback(); }); // message.vale --> valeu/text to write in write.txt jsonStream.write(JSON.parse(message.value)); var writeStream = sftp.createWriteStream("/path/to/write/write.txt"); //"close" event didn't work for me! writeStream.on( 'close', function () { console.log( "- done!" ); sftp.end(); } ); //"finish" event didn't work for me either! writeStream.on( 'close', function () { console.log( "- done!" sftp.end(); } ); // finally this worked for me! jsonStream.on('data', function(data) { var toString = Object.prototype.toString.call(data); console.log('type of data:', toString); console.log( "- file transferred" ); }); jsonStream.pipe( writeStream ); 

Вот решение, которое обрабатывает ошибки в запросах и вызывает обратный вызов после записи файла:

 request(opts) .on('error', function(err){ return callback(err)}) .pipe(fs.createWriteStream(filename)) .on('finish', function (err) { return callback(err); }); 
  • Как выполнить внешнюю программу из Node.js?
  • В мокко-тестировании при вызове асинхронной функции, как избежать таймаута Ошибка: превышение тайм-аута в 2000 мс
  • Как я могу запросить различные значения в Mongoose?
  • Узел: войдите в файл вместо консоли
  • Остановить Mongoose от создания свойства _id для элементов массива поддокумента
  • В чем разница между зависимостями, devDependencies и peerDependencies в файле npm package.json?
  • Удаление ключа из документа MongoDB с использованием Mongoose
  • Почему цикл while блокирует цикл событий?
  • $ искать несколько уровней без $ unwind?
  • Express.js req.ip возвращает :: ffff: 127.0.0.1
  • поле мангуста с типом имени
  • Давайте будем гением компьютера.