nodejs / nodejs/node

`for await (const c of process.stdin)` does not accept EOF in Windows

Offen
#61,397 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

Version

v24.13.0

Platform
Microsoft Windows NT 10.0.26200.0 x64
Subsystem

No response

What steps will reproduce the bug?
  1. Run node -e "for await (const c of process.stdin) console.log(c)"
  2. [f] [o] [o] [Enter]
  3. [Ctrl] + [Z] or [Ctrl] + [D] (= EOF)
  4. [Enter]
How often does it reproduce? Is there a required condition?

Always

What is the expected behavior? Why is that the expected behavior?

In Ubuntu and Alma Node successfully stop reading by Ctrl + D:

$ node -e "for await (const c of process.stdin) console.log(c)"
foo
<Buffer 66 6f 6f 0a>
What do you see instead?

Node will never stop reading in spite of [Ctrl] + [Z] or [Ctrl] + [D]:

PS> node -e "for await (const c of process.stdin) console.log(c)"
foo
<Buffer 66 6f 6f 0d 0a>
^Z
<Buffer 1a 0d 0a>
^D
<Buffer 04 0d 0a>

I had to end up with killing the process by Ctrl + C.

Additional information

I usually use Proto to manage Node versions, but it was able to be reproduced in the portable version in the official zipball:

PS> .\Downloads\node-v24.13.0-win-x64\node -e "for await (const c of process.stdin) console.log(c)"
foo
<Buffer 66 6f 6f 0d 0a>
^Z
<Buffer 1a 0d 0a>
^D
<Buffer 04 0d 0a>

PS> echo $?
False

(ended up with Ctrl + C)

Workaround: insert if ((c[0] === 4 || c[0] === 0x1a) && c.length === 1 + EOL.length && c.toString("latin1", c.length - EOL.length) === EOL) break; (import { EOL } from "node:os")

If this bug did not exist, you would be able to retrieve the entire multiline text from stdin by (await Array.fromAsync(process.stdin)).join("") in all platforms.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das Problem unter Windows mit dem gemeldeten Befehl node -e "for await (const c of process.stdin) ..." zu reproduzieren, und verfolge den Einstiegspunkt für die asynchrone Iteration von process.stdin. Als erledigt gilt die Aufgabe, wenn Ctrl+Z oder Ctrl+D als EOF erkannt wird, die Schleife beendet wird und das Verhalten durch einen Windows-Regressionstest abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, node.js
Bereich
cli, operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.