nodejs writeStream записывает только одну строку

#arrays #json #node.js #streamwriter

#массивы #json #node.js #streamwriter

Вопрос:

Я пытаюсь, чтобы моя программа записывала содержимое массива, заполненного пакетами JSON, в текстовый файл, указанный при инициализации, прямо перед выходом. Однако вместо записи всего массива программа настаивает на записи только одного пакета в файл вместо сотен пакетов, которые она должна записывать. У меня есть цикл for, который перебирает массив, и я вызываю stream.write(messageArray[i]) для каждого элемента в массиве.

Массив заполняется 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]   ",rn");
        stream.end();
        process.exit();
    } 
}

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

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

Кто-нибудь знает, в чем проблема?

Ответ №1:

Запись может быть отложена, а обработчик выхода является синхронным, поэтому процесс завершается после вызова обработчика, что может привести к тому, что записи никогда не произойдут.

Вместо этого вам следует выполнить синхронную запись в файл:

 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(',rn'));
        process.exit();
    } 
}

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

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