node.js: readSync из стандартного ввода? - PullRequest
50 голосов
/ 07 августа 2010

Можно ли синхронно читать из stdin в node.js? Потому что я пишу брейкфук для компилятора JavaScript на JavaScript (просто для удовольствия). Brainfuck поддерживает операцию чтения, которая должна выполняться синхронно.

Я пробовал это:

const fs = require('fs');
var c = fs.readSync(0,1,null,'utf-8');
console.log('character: '+c+' ('+c.charCodeAt(0)+')');

Но это только производит этот вывод:

fs:189
  var r = binding.read(fd, buffer, offset, length, position);
              ^
Error: EAGAIN, Resource temporarily unavailable
    at Object.readSync (fs:189:19)
    at Object.<anonymous> (/home/.../stdin.js:3:12)
    at Module._compile (module:426:23)
    at Module._loadScriptSync (module:436:8)
    at Module.loadSync (module:306:10)
    at Object.runMain (module:490:22)
    at node.js:254:10

Ответы [ 11 ]

0 голосов
/ 08 июня 2017

Я написал этот модуль , чтобы прочитать по одной строке за раз из файла или стандартного ввода.Модуль имеет имя line-reader, что позволяет ES6 *Generator function выполнять итерацию по одной строке за раз.Вот пример кода (в TypeScript) из readme.md.

import { LineReader } from "line-reader"

// FromLine and ToLine are optional arguments
const filePathOrStdin = "path-to-file.txt" || process.stdin
const FromLine: number = 1 // default is 0
const ToLine: number = 5 // default is Infinity
const chunkSizeInBytes = 8 * 1024 // default is 64 * 1024

const list: IterableIterator<string> = LineReader(filePathOrStdin, FromLine, ToLine, chunkSizeInBytes)

// Call list.next to iterate over lines in a file
list.next()

// Iterating using a for..of loop
for (const item of list) {
   console.log(item)
}

Помимо приведенного выше кода, вы также можете взглянуть на папку src > tests в репо .

Примечание: -
считыватель строк * Модуль 1015 * не считывает весь материал в память, а использует функцию генератора для генерации строк асинхронно или синхронно.

...