nodejs WriteStream只写一行

时间:2014-06-24 18:46:38

标签: arrays 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] + ",\r\n");
        stream.end();
        process.exit();
    } 
}

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

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

有谁知道这是什么问题?

1 个答案:

答案 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}));