2014-06-24 3 views
0

내 프로그램에서 JSON 패킷으로 채워진 배열의 내용을 초기화 직전, 종료 직전 텍스트 파일에 쓰려합니다. 그러나 전체 어레이를 작성하는 대신 프로그램은 작성해야하는 수백 개의 패킷 대신 파일에 단일 패킷을 쓰는 것만을 요구합니다. 배열을 반복하는 for 루프가 있고 배열의 각 요소에 대해 stream.write (messageArray [i])를 호출합니다.nodejs WriteStream은 한 줄만 작성합니다.

배열은 데이터 그램 소켓에 의해 수신 된 JSON으로 채워지고 트래픽의 지난 80 초 동안 롤링 창을 유지합니다. 즉, 배열에는 항상 마지막 80 초의 데이터 만 포함됩니다. 다음은 코드의 일부입니다. 나는 그것이 작동한다는 것을 알고 있기 때문에 시간 이동을 생략했다.

var filename = String(process.argv[2]); 
var dgram = require('dgram'); 
var server = dgram.createSocket('udp4'); 
var fs = require('fs'); 
var stream = fs.createWriteStream(filename); 
var messageArray= []; 

server.on('message', function(message, rinfo){ 
try{ 
    messageArray.push(JSON.stringify(JSON.parse(message))); 
} 
catch(e) 
    {console.log(e); console.log(message);} 
total++; 

}); 
server.on('listening', function(){ 
    var address = server.address(); 
    console.log('server listening on ' + address.address + ':' + address.port); 
}); 
server.bind(5139); 

function exitHandler(options, err){ 
    if(err) console.log(err.stack); 
    if(options.exit){ 

     stream.on('error', function(err){ 
      console.log(err.stack); 
     }); 
     var i = 0; 
     for(i; i< messageArray.length; i++) 
       stream.write(messageArray[i] + ",\r\n"); 
     stream.end(); 
     process.exit(); 
    } 
} 

process.on('SIGINT', exitHandler.bind(null, {exit:true})); 

process.on('uncaughtException', exitHandler.bind(null , {exit:true})); 

누구에게 무슨 문제가 있는지 알고 있나요?

답변

2

쓰기가 지연되고 종료 핸들러가 동기식이므로 처리기가 호출 된 후 프로세스가 종료되므로 쓰기가 발생하지 않을 수 있습니다.

var filename = String(process.argv[2]); 
var dgram = require('dgram'); 
var server = dgram.createSocket('udp4'); 
var fs = require('fs'); 
var messageArray= []; 

server.on('message', function(message, rinfo){ 
try{ 
    messageArray.push(JSON.stringify(JSON.parse(message))); 
} 
catch(e) 
    {console.log(e); console.log(message);} 
total++; 

}); 
server.on('listening', function(){ 
    var address = server.address(); 
    console.log('server listening on ' + address.address + ':' + address.port); 
}); 
server.bind(5139); 

function exitHandler(options, err){ 
    if(err) console.log(err.stack); 
    if(options.exit){ 
     fs.writeFileSync(filename, messageArray.join(',\r\n')); 
     process.exit(); 
    } 
} 

process.on('SIGINT', exitHandler.bind(null, {exit:true})); 

process.on('uncaughtException', exitHandler.bind(null , {exit:true})); 
:

당신이 대신해야 할 것은 파일에 동 기적으로 작성하는 것입니다

관련 문제