0

Amazon S3 バケット内のいくつかの小さなファイルを管理する方法として、node.js の knox モジュールを試しています。ファイルをアップロードしたり、ファイルをダウンロードしたりできます。ただし、定期的なスケジュールでファイルをダウンロードできるようにしたいと考えています。間隔を置いて実行するようにコードを変更すると、ダウンロードしたファイルが上書きされるのではなく、前のインスタンスに追加されます。

ファイル書き込みコードを間違えたのか、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);
4

1 に答える 1

1

問題は、の配置にありvar downTxt = '';ます。これは downTxt を空白に設定する唯一の場所であるため、前のリクエストからデータをクリアすることはないため、データをさらに取得するたびに、前のリクエストで取得したデータに追加します。最も簡単な修正は、その行を行の直前に移動することsetEncodingです。

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

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);
  });
})();
于 2012-02-04T17:51:46.787 に答える