2012-02-04 2 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 = '';의 당신의 위치에있다. 그 곳을 Txt로 설정하면 빈 공간이됩니다. 따라서 더 많은 데이터를 검색 할 때마다 이전 요청에서 데이터를 지우지 않으므로 이전 요청에서 가져온 데이터에 데이터를 추가합니다. 가장 간단한 해결 방법은 해당 줄을 setEncoding 줄 바로 이전으로 이동하는 것입니다.

그러나 데이터를 처리하는 방식은 불필요하게 복잡합니다. 대신이 같은 것을 시도해보십시오. 매번 클라이언트를 다시 만들 필요가 없으며 인코딩을 설정하면 비 텍스트 파일을 다운로드 할 때 내용이 손상되며 텍스트 파일과 차이가 없습니다. 다음으로, 수동으로 데이터를 수집해서는 안되며, 데이터를 수신하자마자 바로 파일에 기록 할 수 있습니다. 마지막으로 요청은 표준 스트림이므로 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); 
    }); 
})(); 
+0

아아, downTxt를 재설정하는 것을 잊어 버리는 것은 내가 어딘가에서 만들어야하는 명백한 골머리 실수의 일종입니다. 다른 제안에도 감사드립니다. 나는 파이프를 많이 사용하지는 않았지만 분명히 훨씬 더 우아합니다. –