#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}));