Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Nodeのpipeがうまく流れない

More than 5 years have passed since last update.

Nodeバージョン0.12.7での話

なのでStream3の話になりますね。

問題のコード

let ftp = require('ftp') ;
let fs = require('fs') ;
ftp.get('file',function(err,stream) {
    let write = fs.createWriteStream('dst');
    write.on('finish',function(){
        console.log('終了通知') ;
    });
    write.on('error',function(){
        console.log('エラー処理') ;
    });
    stream.pipe(write) ;
}

こんな感じでパイプつないでFTPでとってきてたわけですが、
140kほどのファイルが128kしか取ってこれませんでした。

なんでこうなるか?

ソース追っかけてないので、よくわかんないんですが…
どうもreadableStreamのバッファがのこってたみたいです。

どうするか?

  • 読み込み終了で自動で書き込みも終了させない。
    • stream.pipe(write,{end:false});
  • 読み込み終了時に、バッファをpipeの先に書き出す
    stream.on('end',function(){write.end(stream.read());});

結果

これで何とかなりました。

let ftp = require('ftp') ;
let fs = require('fs') ;
ftp.get('file',function(err,stream) {
    let write = fs.createWriteStream('dst');
    write.on('finish',function(){
        console.log('終了通知') ;
    });
    write.on('error',function(){
        console.log('エラー処理') ;
    });
    stream.on('end',function(){
        write.end(stream.read());
    });
    stream.pipe(write,{end:false});
}

そのうち、こんなことしなくても良くなるんだろうか…

追記

上記のコードではうまくいかない場合がありました。
pipeに流れたデータがwrite.end(stream.read())で再度書かれることが…
なので、pipe使わないほうがすっきり書けそうです。

let ftp = require('ftp') ;
let fs = require('fs') ;
ftp.get('file',function(err,stream) {
    let write = fs.createWriteStream('dst');
    write.on('finish',function(){
        console.log('終了通知') ;
    });
    write.on('error',function(){
        console.log('エラー処理') ;
    });
    stream.on('end',function(){
        write.end();
    });
    stream.on('data',function(chunk){
        write.write(chunk) ;
    }
);
}
himox_x
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away