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