2016-01-24 2 views
1

Новичок для узла здесь. Я пытаюсь загрузить .tar.xz файл и распаковать его в директорию с помощью кода, показанного ниже:Почему в этом коде Node.js не происходит «финишное» событие?

var request = require('request'); 
var tar = require('tar'); 
var xz = require('xz'); 

function downloadRaw(url, callback) 
{ 
    return request({ 
     encoding: null, 
     url: url 
    }, callback); 
} 

function extractToDirectory(url, directory, callback) 
{ 
    return downloadRaw(url) 
     .pipe(new xz.Decompressor()) 
     .pipe(tar.Extract(directory)) 
     .on('finish', callback); 
} 

По какой-то причине не кажется 'finish' событие на поток смолы будет стрелять, даже после того, как он закончит извлечение содержимого архива. tar - это библиотека, которая поддерживается самими часами нпм, поэтому я предполагаю, что здесь я совершаю какую-то ошибку. Во всяком случае, почему это происходит и что я могу сделать, чтобы исправить это?

ответ

0

Оказывается error событие стрельбы, но не в finish. Это фиксировало это:

function extractToDirectory(url, directory, callback) 
{ 
    return downloadRaw(url) 
     .pipe(new xz.Decompressor()) 
     .pipe(tar.Extract(directory)) 
     .on('error', callback) 
     .on('finish', callback); 
} 
0

Я вижу, что downloadRaw принимает обратный вызов, но вы никогда его не передадите, и поэтому вы передаете неопределенное значение функции запроса.

Если вы хотите использовать потоковое api, тогда не передавайте обратный вызов любой из этих функций.

На самом деле, зачем вообще беспокоиться об этой сырой функции. Почему бы не просто сделать:

return request(url) 
.pipe(newxz.Decompressor()) 
.pipe(tar.Extract(directory)) 
.on('finish', callback); 
Смежные вопросы