0

私はストリーミングから以下のデータを持っています:

'ID|20120206|080500|0000001|0|1|record1|END'
'ID|20120206|080500|0000002|0|1|record2|END'
'ID|20120206|080500|0000003|0|1|record3|END'

そして、以下のnodejsコードを使用して、ストリーミングデータを1行ずつ処理したい:

var net = require('net');

var HOST = 'localhost',
    PORT = 9010,
    lastSeqNo = 0;

var client = new net.Socket();
client.setEncoding('ascii');

client.connect(PORT, HOST, function () {
    console.log('Connected to: %s : %d', HOST, PORT);
});

client.on('close', function (hadError) {
    console.log(hadError);
});

client.on('error', function (ex) {
    console.log(ex);
});

var i = 1;
var Line = function (rows, data) {
    this.SeqNo = parseFloat(rows[3].trim());
    this.Date = rows[1].trim();
    this.Time = rows[2].trim();
    this.MsgType = parseInt(rows[4].trim(), 10);
    this.Data = data;
};

client.on('data', function (data) {
    var content = data.split('\r\n');
    content.forEach(function (item) {
        if (item.length > 0) {
            console.log(i, item);
            i++;

            var rows = item.split('|'),
                line = new Line(rows, data),
                seqNo = line.SeqNo,
                msgType = line.MsgType;

            console.log('seqno:', seqNo);
        }
    });
});

いくつかのデータラインプロセスの後、以下のようなエラーが発生しました:

D:\test node\app.js:33
    this.SeqNo = parseFloat(rows[3].trim());
                                    ^
TypeError: Cannot call method 'trim' of undefined
    at new <anonymous> (D:\test node\app.js:33:37)
    at D:\test node\app.js:48:24
    at Array.forEach (native)
    at Socket.<anonymous> (D:\test node\app.js:42:13)
    at Socket.emit (events.js:67:17)
    at TCP.onread (net.js:362:31)

上記のコードの何が問題なのか教えていただけますか?

ありがとうございました。インドネシアからのご挨拶。

4

1 に答える 1

2

イベントは、data完全な行を一度に送信することを保証しません。ほとんどの場合、問題はコードが期待するよりも少ないデータを実際に取得したことであり、したがってrows[3]未定義です。

あなたが言ったように、あなたはデータをストリーミングしています。イベントをリッスンすると、data一度に完全なバッチではなく、データのほんの一部しか取得できない場合があります。

于 2012-04-05T07:29:07.837 に答える