2017-05-24 11 views
2

私は "nameserver 8.8.8.8"を見つけたら、一行ずつ読み込み、読み込みを中止します。readlineはrl.close()の後で行の読み取りを停止しませんnodejsで

nameserver 8.8.8.8 
nameserver 45.65.85.3 
nameserver 40.98.3.3 

私はできるだけ早く私は最初のマッチを読んで)(rl.closeとの緊密なイベントを発するので、私は私を期待するので、

const readline = require('readline'); 
const fs = require('fs'); 

function check_resolv_nameserver(){ 
    // flag indicates whether namerserver_line was found or not 
    var nameserver_flag = false; 

    const rl = readline.createInterface({ 
    input: fs.createReadStream('file_to_read.conf') 
    }); 

    rl.on('line', (line) => { 
    console.log(`Line from file: ${line}`); 
    if (line === 'nameserver 8.8.8.8'){ 
     console.log('Found the right file. Reading lines should stop here.'); 
     nameserver_flag = true; 
     rl.close(); 
    } 
    }); 

    rl.on('close', function(){ 
    if (nameserver_flag === true){ 
     console.log('Found nameserver 8.8.8.8'); 
    } 
    else { 
     console.log('Could not find nameserver 8.8.8.8'); 
    } 
    }); 
} 

check_resolv_nameserver(); 

を行うにはnodejsとreadlineのモジュールを使用しています最初の行だけを読み込み、さらに読み込みを停止するようにコードします。しかし代わりに私の出力は次のようになります

Line from file: nameserver 8.8.8.8 
Found the right file. Reading lines should stop here. 
Found nameserver 8.8.8.8 
Line from file: nameserver 45.65.85.3 
Line from file: nameserver 40.98.3.3 

私は最初の試合後にreadlineを止めて何か別のものを進めることができますか?

+0

私の推測では、ファイルの内容がバッファリングされているということですので、 'rl'(またはファイルハンドル)を閉じることであることから、より' line'イベントを防ぐことはできませんまだバッファに完全な行がある場合に放出されます。回避策は、正しい行を取得したらフラグを設定し、そのフラグが設定されている場合は後続の行を無視することです。 – robertklep

答えて

0

あなたにも、ストリームを閉じる必要があります:

const readline = require('readline'); 
const fs = require('fs'); 
const readStream = fs.createReadStream('file_to_read.conf'); 

// More code here ... 

const rl = readline.createInterface({ 
    input: readStream 
    }); 

// Rest of your code 

rl.close(); 
readStream.destroy(); 
+1

これは私にとっては役に立たない – Cristian

関連する問題