2014-06-07 2 views
1

curl을 사용하여 요청에서 값을 가져 와서 파일에 저장하고 저장된 내용을 다시 제공하려는 프로그램이 있습니다. 내가 콘솔에서 얻고 무엇을이 프로그램을 실행할 때 저장하거나 파일의 내용을 추가하기로 한 결정은 쿼리 매개 변수 appendFlag 을 기반으로 지금이 그것을 실제로 읽고 제안 "을 추가" "사실"이고 플래그는 if 부분으로 이동하지만 어떻게 든 appendFile 함수가 작동하지 않습니다.노드 append 파일 시스템에 파일 청크를 추가하지 않는 파일

var http = require('http'); 
var url = require('url'); 
var querystring = require('querystring'); 
var fs = require('fs'); 
http.createServer(function(request,response){ 
    var str = request.url.split('?')[1]; 
    var query = querystring.parse(str); 
    var writeStream = fs.createWriteStream(query['fileName']); 
    console.log("query - "); 
    console.log(query["appendFlag"]); 
    request.on('data',function(chunk){ 
     if(query["appendFlag"]=="true"){ 
      console.log("appending"); 
      fs.appendFile(query['fileName'],chunk.toString(),function(err){ 
       if(err) throw err; 
      }); 
     }else{ 
      var bufferGood = writeStream.write(chunk); 
      if(!bufferGood) request.pause(); 
     } 
    }); 
    request.on('end',function(){ 
     response.writeHead(200); 
     response.write("\n Content with this url is - \n"); 
     var readStream = fs.createReadStream(query['fileName'],{bufferSize:64*1024}); 
     readStream.on('data',function(chunk){ 
      response.write(chunk.toString()); 
     }); 
     readStream.on('end',function(){ 
      response.write("\n"); 
      response.end(); 
     }); 
    }); 
    writeStream.on('drain',function(){ 
     request.resume(); 
    }); 
}).listen(8080); 

그런 다음 SO (How to create appending writeStream in Node.js)에서 답을 읽은 후 나는 시도 -

// Program to extract url from the request and writing in that particular file 

var http = require('http'); 
var url = require('url'); 
var querystring = require('querystring'); 
var fs = require('fs'); 
http.createServer(function(request,response){ 
    var str = request.url.split('?')[1]; 
    var query = querystring.parse(str); 
    var writeStream = fs.createWriteStream(query['fileName']); 
    options = { 
     'flags': 'a' , 
     'encoding' : null, 
     'mode' : 0666 
    } 
    var appendStream = fs.createWriteStream(query['fileName'],[options]); 
    console.log("query - "); 
    console.log(query["appendFlag"]); 
    request.on('data',function(chunk){ 
     if(query["appendFlag"]=="true"){ 
      console.log("appending"); 
      var bufferGood = appendStream.write(chunk.toString()); 
      if(!bufferGood) request.pause(); 
     }else{ 
      var bufferGood = writeStream.write(chunk.toString()); 
      if(!bufferGood) request.pause(); 
     } 
    }); 
    request.on('end',function(){ 
     response.writeHead(200); 
     response.write("\n Content with this url is - \n"); 
     var readStream = fs.createReadStream(query['fileName'],{bufferSize:64*1024}); 
     readStream.on('data',function(chunk){ 
      response.write(chunk.toString()); 
     }); 
     readStream.on('end',function(){ 
      response.write("\n"); 
      response.end(); 
     }); 
    }); 
    writeStream.on('drain',function(){ 
     request.resume(); 
    }); 
}).listen(8080); 

은 ''에 플래그를 변경되었는지와도 데이터를 추가하지 않았다?

답변

3

첫 번째 변형을 사용할 수 있습니다. 그러나 appendFile() 전에 writeStream을 열어 동일한 query["filename"]을 입력했습니다. 스트림이 이미 열려 있습니다.

var options = { 
    flags: query.appendFile ? 'w' : 'a' 
    ... 

다음 : 왜 [options]

var writeStream = fs.createWriteStream(query['fileName']); 
options = { 
    'flags': 'a' , 
    'encoding' : null, 
    'mode' : 0666 
} 
var appendStream = fs.createWriteStream(query['fileName'],[options]); 

는 그런 짓을하는 것이 낫다 할 수 있습니까? 괄호를 제거해야합니다.

다음 : querystringfilename 매개 변수가 있음을 보장 할 수 없습니다. 이 상황을 처리하십시오.

+0

감사합니다. 단지 기능 테스트였습니다. 나는 그것을 구현할 때 이러한 오류 상황을 처리 할 것이다. 또한 네, 하나의 파일에 두 개의 디스크립터가있어서 하나를 제거해야만했기 때문에 추가 할 수 없었습니다. – DeadMan

+0

옵션을 사용하면 파일을 올바르게 추가 할 수있었습니다. 번호가 잘못되어 '옵션'에서 대괄호를 제거 했으므로 '모드'를 삭제해야했습니다. – cpres

관련 문제