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

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

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

Ответы на вопрос(5)

На основании документа nodejs,http://nodejs.org/api/stream.html#stream_event_finish, it should handle writableStream's finish событие.

var writable = getWriteable();
var readable = getReadable();
readable.pipe(writable);
writable.on('finish', function(){ ... });
 30 авг. 2015 г., 16:13
Принятый ответ не работает для меня с узлом v0.12.7, но ваше решение работает.

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

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });
Решение Вопроса

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

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

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

 16 апр. 2014 г., 16:44
«Конец» событие сейчас "закончено" Труба события:nodejs.org/api/stream.html#stream_event_finish
 29 янв. 2016 г., 19:31
«Конец» Событие все еще существует и используется для чтения потоков. Доступные для записи потоки используют «конец». Это потому, что поток Transform представляет собой смесь обоих и должен различать события.
 10 авг. 2017 г., 21:53
Этот поток - хорошее резюме того, как выглядит работа с потоками узлов.
 31 авг. 2013 г., 23:43
var r = request(...).on("end",function(){/* CALLBACK */}).pipe(...);
 16 дек. 2013 г., 21:20
для меня событие «закрыть», а не «конец»; работаетr.on('close'), 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);
});
 20 сент. 2015 г., 07:04
On 'a finish; apos; работает на меня и "конец" не. Спасибо!
 06 окт. 2016 г., 08:02
в одном конкретном случае, похоже, что Finish запускается до того, как поступят все ожидаемые

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

Большая часть примера создания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 );
 24 мая 2017 г., 17:37
Вместо того, чтобы слушать «конец» у вас есть два обработчика для «закрытия», возможно, в этом была причина. & Quot; конец & quot; событие работает для меня.

Ваш ответ на вопрос