我正在尝试让我的程序将填充了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] + ",\r\n");
stream.end();
process.exit();
}
}
process.on('SIGINT', exitHandler.bind(null, {exit:true}));
process.on('uncaughtException', exitHandler.bind(null , {exit:true}));
有谁知道这是什么问题?
答案 0 :(得分: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}));