পাইপ সম্পূর্ণরূপে পরিচালনা করতে কলব্যাক


195

কিছু url থেকে ডকুমেন্ট ডাউনলোড করতে এবং এটি ডিস্কে সংরক্ষণ করতে আমি নীচের নোড.জেএস কোডটি ব্যবহার করছি। দস্তাবেজটি কখন ডাউনলোড হবে তা সম্পর্কে আমি অবহিত হতে চাই। পাইপের সাথে আমি কোনও কলব্যাক দেখিনি O বা, এমন কোনও 'শেষ' ইভেন্ট রয়েছে যা ডাউনলোড শেষ হওয়ার পরে ধরা পড়তে পারে?

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

উত্তর:


301

স্ট্রিমগুলি 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 () {...})
— জডসন

9
'শেষ' ইভেন্টটি এখন পাইপ ইভেন্টগুলি 'ফিনিশ' শেষ: নোডজস.আর.জি.পি.আই
— পিয়ের-লুক

13
'শেষ' ইভেন্টটি এখনও বিদ্যমান এবং পঠনযোগ্য স্ট্রিমগুলিতে ব্যবহৃত হয়। লিখিত স্ট্রিমগুলি 'ফিনিশ' ব্যবহার করে। এটি কারণ ট্রান্সফর্ম স্ট্রিম উভয়ের মিশ্রণ এবং ইভেন্টগুলির মধ্যে পার্থক্য করা প্রয়োজন।
— নোডারম্যান

16
এই থ্রেডটি নোড স্ট্রিমগুলির সাথে কীভাবে কাজ করা দেখায় তার একটি ভাল সংক্ষিপ্তসার।
— পম্বার

43

ভিত্তিক নোডেজ নথি, http://nodejs.org/api/stream.html#stream_event_finish , এটি লিখনযোগ্য স্ট্রিমের finishইভেন্টটি পরিচালনা করবে ।

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

গৃহীত উত্তরটি নোড v0.12.7 দিয়ে আমার পক্ষে কাজ করে না, তবে আপনার সমাধানটি করে।
— লুকা স্টেব

9

ওয়েব সিস্টেমে HTTP (গুলি) এর মাধ্যমে ফাইল সিস্টেমে পাইপ দেওয়ার জন্য কোড স্নিপেট। @ স্টারবিআমরিনবোলাবস লক্ষ্য করে ঘটনাটি 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);
});

অন ​​'ফিনিস' আমার পক্ষে কাজ করে এবং 'শেষ' হয় না। ধন্যবাদ!
— shaosh

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);
    });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.