LoginSignup
4
3

More than 5 years have passed since last update.

Nodeのpipeがうまく流れない

Last updated at Posted at 2015-10-23

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3