2015-06-03 9 views
8

Ich habe eine einfache node.js App, um Stdin zu echo. Wenn ich es interaktiv auf der Windows-Konsole ausführte, erwartete ich, dass Control-Z als EOF-Signal erkannt wurde. Aber es ist nicht. Wie bekomme ich eine Knoten-App, um Control-Z als EOF zu behandeln?Wie signalisieren Sie EOF zu node.js stdin von der Konsole?

// testEcho.js 

process.stdin.setEncoding('utf-8'); 
console.log("input is a TTY?:",process.stdin.isTTY); 

process.stdin.on('readable',function() { 
    var vText = process.stdin.read(); 
    if (vText != null) 
     console.log('echo: "%s"',vText); 
    process.stdout.write('> '); // prompt for next 
    }); 

process.stdin.on('end',function() { // Works for redirected input but not triggered by ^Z on TTY 
    console.log('end of input reached'); 
    }); 

`` `

+0

'process.on („SIGINT“, fn);' – naomik

Antwort

3

Es wäre die Lösung angezeigt ist readline zu verwenden. Dies ist eher Terminal-fähig und behandelt eine interaktive TTY-Ctrl-D als EOF, während auch umgeleitete Eingabeströme korrekt gehandhabt werden. Da es linienorientiert ist, werden Zeilenumbrüche bequem aus den Eingabezeichenfolgen entfernt.

var readline = require('readline'); 
process.stdin.setEncoding('utf-8'); 
console.log("input is a TTY?",process.stdin.isTTY); 

var rl = readline.createInterface({input: process.stdin, output: process.stdout}); 
rl.setPrompt('> '); 
rl.prompt(); 
rl.on('line' ,function(aText) { console.log('echo: "%s"',aText); rl.prompt(); }); 
rl.on('close',function()  { console.log('input has closed'); /* ... */ }); 
+0

Es ist bemerkenswert, dass ctrl-D (nicht Strg-Z) wird als EOF unter Windows erkannt, aber das ist für mich ok Ctrl-D ist ASCII EOT immerhin –

+0

Scheint nicht auf Cygwin zu arbeiten, versuchte Strg + D zu senden, aber NodeJS reagiert nicht mit Zeile lesen. – CMCDragonkai

5

das Problem ist, Sie verwenden process.stdin.on statt process.on()

das Update Siehe ich hier gemacht und alles sollte gut und schön sein :) Viel Spaß!

process.stdin.setEncoding('utf-8'); 
console.log("input is a TTY?:", process.stdin.isTTY); 

process.stdin.on('readable',function() { 
    var vText = process.stdin.read(); 
    if (vText != null) 
     console.log('echo: "%s"',vText); 
    process.stdout.write('> '); // prompt for next 
}); 

process.on('SIGINT', function() { 
    console.log('Over and Out!'); 
    process.exit(0); 
}); 

Auch ersetzt ich 'end' mit 'SIGINT' wie das ist, das Signal, das von CTRL+C

gefangen Sie über die Signalereignisse hier lesen: https://nodejs.org/api/process.html#process_signal_events

+0

Danke, aber leider Kontrolle-C beendet den Prozess, während ich nur versuchen, Ende der Eingabe zu signalisieren, ohne notwendigerweise den Prozess zu stoppen. –

+0

@MichaelLemaire: ctrl-C beendet den Prozess, wenn Sie keinen Handler für 'SIGINT' haben. Sobald Sie einen Handler wie die obige ctrl-C installieren, wird der Prozess nicht mehr beendet. Aus diesem Grund enthält das obige Beispiel 'process.exit()', wenn Sie diese Zeile auskommentieren, wird der Prozess nicht beendet. – slebetman

+1

@MichaelLemaire Kommentar aus 'process.exit (0);' – Datsik

Verwandte Themen