В RingoJS есть функция под названием read
, которая позволяет вам читать весь поток до тех пор, пока конец достигнут. Это полезно, если вы создаете приложение командной строки. Например, вы можете написать tac
программа следующим образом:
#!/usr/bin/env ringo
var string = system.stdin.read(); // read the entire input stream
var lines = string.split("\n"); // split the lines
lines.reverse(); // reverse the lines
var reversed = lines.join("\n"); // join the reversed lines
system.stdout.write(reversed); // write the reversed lines
Это позволяет запускать оболочку и запускать команду tac
. Затем вы вводите столько строк, сколько хотите, и после того, как вы закончите, вы можете нажать Ctrl + D (или Ctrl + Z в Windows), чтобы сигнализировать конец передачи.
Я хочу сделать то же самое в node.js, но я не могу найти никакой функции, которая бы это сделала. Я думал об использовании readSync
функция из fs
библиотека для имитации следующим образом, но безрезультатно:
fs.readSync(0, buffer, 0, buffer.length, null);
файловый дескриптор для stdin (первый аргумент) - 0
. Поэтому он должен читать данные с клавиатуры. Вместо этого он вызывает следующую ошибку:
Error: ESPIPE, invalid seek
at Object.fs.readSync (fs.js:381:19)
at repl:1:4
at REPLServer.self.eval (repl.js:109:21)
at rli.on.self.bufferedCmd (repl.js:258:20)
at REPLServer.self.eval (repl.js:116:5)
at Interface.<anonymous> (repl.js:248:12)
at Interface.EventEmitter.emit (events.js:96:17)
at Interface._onLine (readline.js:200:10)
at Interface._line (readline.js:518:8)
at Interface._ttyWrite (readline.js:736:14)
Как бы вы синхронно собирали все данные во входном текстовом потоке и возвращали его как строку в node.js? Пример кода был бы очень полезен.