पाइप की पूर्णता को संभालने के लिए कॉलबैक


196

मैं कुछ नोड से दस्तावेज़ डाउनलोड करने और इसे डिस्क में सहेजने के लिए निम्न नोड.जेएस कोड का उपयोग कर रहा हूं। मैं इस बारे में सूचित करना चाहता हूं कि दस्तावेज़ कब डाउनलोड किया जाता है। मैंने पाइप के साथ कोई कॉलबैक नहीं देखा है। क्या, कोई ऐसी 'अंतिम' घटना है जिसे डाउनलोड पूरा होने पर कैप्चर किया जा सकता है?

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

जवाबों:


302

धाराएँ हैं EventEmitterइसलिए आप कुछ घटनाओं को सुन सकते हैं। जैसा कि आपने कहा कि finishअनुरोध (पहले end) के लिए एक घटना है ।

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

किन घटनाओं के बारे में अधिक जानकारी के लिए आप स्ट्रीम प्रलेखन पृष्ठ देख सकते हैं ।


12
var r = request(...).on("end",function(){/* CALLBACK */}).pipe(...);
विटाली

6
मेरे लिए घटना 'करीब' के बजाय, 'अंत' काम करती हैr.on('close'), function () {...})
Judson

9
'एंड' इवेंट अब 'फिनिश' पाइप इवेंट्स है: nodejs.org/api/stream.html#stream_event_finish
Pier-Luc Gendreau

13
'अंत' घटना अभी भी मौजूद है और पठनीय धाराओं पर प्रयोग की जाती है। लिखने योग्य धाराएँ 'फिनिश' का उपयोग करती हैं। ऐसा इसलिए है क्योंकि ट्रांसफ़ॉर्म स्ट्रीम दोनों का मिश्रण है और घटनाओं के बीच अंतर करने की आवश्यकता है।
noderman

16
यह धागा एक अच्छा सारांश है कि नोड स्ट्रीम के साथ काम करना कैसा दिखता है।
19

43

आधारित नोडज दस्तावेज, http://nodejs.org/api/stream.html#stream_event_finish , यह writableStream की finishघटना को संभालना चाहिए ।

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

स्वीकृत उत्तर मेरे लिए नोड v0.12.7 के साथ काम नहीं करता है, लेकिन आपका समाधान करता है।
लुका स्टील

9

फाइल सिस्टम के लिए 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);
});

मेरे लिए 'खत्म' काम करता है और 'अंत' नहीं करता। धन्यवाद!
5

1
एक विशेष मामले में, सभी अपेक्षित बाइट्स आने से पहले फिनिश फायरिंग लगती है
माइकल

4

मुझे इस संदर्भ में अपनी समस्या का थोड़ा अलग समाधान मिला। विचार साझा करने लायक।

ज्यादातर उदाहरण readStreamsफ़ाइल से बनाते हैं। लेकिन मेरे मामले readStreamमें JSONएक संदेश पूल से आने वाले स्ट्रिंग से बनाया जाना है ।

var jsonStream = through2.obj(function(chunk, encoding, callback) {
                    this.push(JSON.stringify(chunk, null, 4) + '\n');
                    callback();
                });
// message.value --> value/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 );

"खत्म" के लिए सुनने के बजाय आपके पास "करीब" के लिए दो हैंडलर हैं, शायद यही कारण था। "खत्म" घटना मेरे लिए काम करती है।
jowo

3

यहां एक समाधान है जो अनुरोधों में त्रुटियों को संभालता है और फ़ाइल लिखे जाने के बाद कॉलबैक कहता है:

request(opts)
    .on('error', function(err){ return callback(err)})
    .pipe(fs.createWriteStream(filename))
    .on('finish', function (err) {
        return callback(err);
    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.