2012-02-04 6 views
0

Amazon S3バケット内のいくつかの小さなファイルを管理する方法としてnode.jsのknoxモジュールを試しています。すべてがうまくいきます。ファイルをアップロードしたり、ファイルをダウンロードしたりできます。ただし、定期的にファイルをダウンロードできるようにしたい。ある間隔で実行するようにコードを修正すると、上書きする代わりにダウンロードしたファイルを前のインスタンスに追加しています。knox/node.jsを使用してAmazon S3からファイルを取得するときに追加する理由

ファイルの書き込みコードやknoxの処理コードに間違いがあったかどうかはわかりません。私はいくつかの異なる書き込み方法(writeFile、writeStreamなど)を試してきました。そして、私はknoxソースコードを見てきました。私にとって明らかなことは何も問題として際立っていません。ここで私が使用しているコードです:

knox = require('knox'); 
fs = require('fs'); 
var downFile = DOWNFILE; 
var downTxt = ''; 
var timer = INTERVAL; 
var path = S3PATH + downFile; 
setInterval(function() 
{ 
     var s3client = knox.createClient(
     { 
       key: '********************', 
       secret: '**********************************', 
       bucket: '********' 
     }); 
     s3client.get(path).on('response', function(response) 
     { 
       response.setEncoding('ascii'); 
       response.on('data', function(chunk) 
       { 
         downTxt += chunk; 
       }); 
       response.on('end', function() 
       { 
         fs.writeFileSync(downFile, downTxt, 'ascii'); 
       }); 
     }).end(); 
}, 
timer); 

答えて

1

問題はvar downTxt = '';のプレースメントです。それは空白にdownTxtを設定する唯一の場所なので、以前の要求からデータをクリアすることはないので、前の要求で取得したデータに追加のデータを追加します。最も簡単な修正は、その行をsetEncoding行の直前に移動することです。

ただし、データを処理する方法は不必要に複雑です。代わりにこのようなものを試してみてください。毎回クライアントを再作成する必要はありません。エンコーディングを設定すると、テキスト以外のファイルをダウンロードしてもテキストファイルと違いはありません。次に、手動でデータを収集するべきではありません。データを受信するとすぐにファイルに書き込むことができます。最後に、requestは標準ストリームなので、pipeを使用するだけでよいため、 'data'イベントを監視する必要はありません。

var knox = require('knox'), 
    fs = require('fs'), 
    downFile = DOWNFILE, 
    timer = INTERVAL, 
    path = S3PATH + downFile, 
    s3client = knox.createClient({ 
     key: '********************', 
     secret: '**********************************', 
     bucket: '********' 
    }); 

(function downloadFile() { 
    var str = fs.createWriteStream(downFile); 
    s3client.get(path).pipe(str); 
    str.on('close', function() { 
    setTimeout(downloadFile, timer); 
    }); 
})(); 
+0

ああ、downTxtをリセットするために忘れ、私は私がどこかに作るする必要があります知っていた明白な骨頭ミスの一種です。他の提案もありがとう。私はずっとパイプで遊んだことはありませんが、それははるかにエレガントです。 –

関連する問題