2012-07-12 38 views
143

Tôi đang sử dụng mã node.js sau để tải xuống tài liệu từ một số url và lưu nó vào đĩa. Tôi muốn được thông báo về thời điểm tài liệu được tải xuống. tôi đã không nhìn thấy bất kỳ gọi lại với pipe.Or, Có bất kỳ sự kiện 'kết thúc' có thể được chụp khi hoàn thành tải về?gọi lại để xử lý hoàn thành đường ống

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

Trả lời

218

Luồng là EventEmitter để bạn có thể nghe một số sự kiện nhất định. Như bạn đã nói, có sự kiện finish cho yêu cầu (trước đây là end).

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

Để biết thêm thông tin về sự kiện nào bạn có thể kiểm tra stream documentation page.

+11

'var r = yêu cầu (...) trên ("kết thúc", function () {/ * CALLBACK * /}). Pipe (...); ' –

+6

cho tôi sự kiện 'close', thay vì 'end' works' r.on ('close'), function() {... }) ' – Judson

+8

Sự kiện 'kết thúc' hiện là 'kết thúc' Sự kiện ống: http://nodejs.org/api/stream.html#stream_event_finish –

28

Tài liệu nodejs gốc, http://nodejs.org/api/stream.html#stream_event_finish, cần xử lý sự kiện finish của writableStream.

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

Câu trả lời được chấp nhận không hoạt động đối với tôi với nút v0.12.7, nhưng giải pháp của bạn có. –

6

Đoạn mã cho nội dung đường ống từ web qua http (s) đến hệ thống tệp. Như @starbeamrainbowlabs nhận thấy sự kiện finish làm xong nhiệm vụ

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); 
}); 
+0

Các 'kết thúc' hoạt động cho tôi và 'kết thúc' thì không. Cảm ơn bạn! – shaosh

+0

trong một trường hợp cụ thể, kết thúc dường như được kích hoạt trước khi tất cả các byte dự kiến ​​đến – Michael

1

Tôi tìm thấy một giải pháp khác nhau một chút vấn đề của tôi liên quan đến bối cảnh này. Tư tưởng đáng chia sẻ.

Hầu hết ví dụ tạo readStreams từ tệp. Nhưng trong trường hợp của tôi readStream phải được tạo từ JSON chuỗi đến từ một nhóm tin nhắn.

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); 
+0

Thay vì nghe cho "kết thúc" bạn có hai trình xử lý cho "đóng", có thể đó là lý do. Sự kiện "kết thúc" hoạt động cho tôi. – jowo

0

Dưới đây là một giải pháp để xử lý những sai sót trong các yêu cầu và kêu gọi một cuộc gọi lại sau khi các tập tin được viết:.

request(opts) 
    .on('error', function(err){ return callback(err)}) 
    .pipe(fs.createWriteStream(filename)) 
    .on('finish', function (err) { 
     return callback(err); 
    }); 
Các vấn đề liên quan