【问题标题】:nodejs WriteStream only writes a single linenodejs WriteStream 只写一行
【发布时间】:2014-08-15 03:42:04
【问题描述】:

我正试图让我的程序在退出之前将一个充满 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}));

有谁知道问题出在哪里?

【问题讨论】:

    标签: arrays json node.js streamwriter


    【解决方案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(',\r\n'));
            process.exit();
        } 
    }
    
    process.on('SIGINT', exitHandler.bind(null, {exit:true}));
    
    process.on('uncaughtException', exitHandler.bind(null , {exit:true}));
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多