2017-05-24 7 views
2

Ich habe die folgende Datei Ich möchte Zeile für Zeile lesen und aufhören zu lesen, sobald ich "Nameserver 8.8.8.8" gefunden habe.readline stoppt nicht Zeile lesen nach rl.close() in Nodejs emittieren

nameserver 8.8.8.8 
nameserver 45.65.85.3 
nameserver 40.98.3.3 

ich NodeJS verwende und das Readline- Modul zu tun, so

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(); 

Da ich ein enges Ereignis mit rl.close() emittieren, sobald ich das erste Spiel zu lesen, würde ich erwarten, mein Code, um nur die erste Zeile zu lesen und dann weiter zu lesen. Aber stattdessen sieht meine Ausgabe wie diese

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 

Wie kann ich Readline- Anschlag nach dem ersten Spiel und lassen Sie mich auch mit einem etwas gehen lassen?

+0

Meine Vermutung ist, dass der Inhalt der Datei zwischengespeichert werden, schließen so 'rl' (oder die Datei-Handle) nicht mehr' line' Ereignisse verhindern, dass ausgesendet, wenn noch vollständige Zeilen im Puffer vorhanden sind. Ein Workaround wäre, ein Flag zu setzen, sobald Sie die richtige Zeile erhalten haben, und nachfolgende Zeilen zu ignorieren, wenn dieses Flag gesetzt ist. – robertklep

Antwort

0

Sie den Stream schließen sollte auch:

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

das funktioniert nicht für mich – Cristian

Verwandte Themen