2015-03-10 8 views
0

Я хочу взять вывод программы C++ и ввести его в stdin файла javascript. Однако я не смог нажать что-либо в stdin, используя метод ...Ввод информации в Javascript с помощью терминала

node example.js < test.txt 

потому что я получаю следующие ошибки.

example.js:35

stdin.setRawMode(true);

TypeError: undefined is not a function

at Object. (example.js:35:7)

at Module._compile (module.js:460:26)

at Object.Module._extensions..js (module.js:478:10)

at Module.load (module.js:355:32)

at Function.Module._load (module.js:310:12)

at Function.Module.runMain (module.js:501:10)

at startup (node.js:129:16)

at node.js:814:3

Код ошибки выглядит так, как указано ниже. Он работает нормально при нормальном входе, однако в описанном выше сценарии происходит сбой.

var stdin = process.stdin; 
stdin.setRawMode(true); 
stdin.resume(); 
stdin.setEncoding('utf8'); 
stdin.on('data', function(key){ 
//do stuff based upon input 

Неужели кто-нибудь столкнулся с этим или какие-либо идеи о том, как его исправить? Или другой способ решить эту проблему?

+0

На какой платформе вы работаете? –

+0

osx 10.10 хотя я также хочу, чтобы это работало на малине PI – user3793489

+0

Собственно, поцарапайте это. Я вижу такое же поведение при перенаправлении stdin. Следствие. –

ответ

1

При запуске вашей программы с перенаправленным stdin вы подключаетесь к ReadStream, а не к TTY, поэтому TTY.setRawMode() не поддерживается.

setRawMode() используется для установки потока tty, чтобы он не обрабатывал свои данные каким-либо образом, например, обеспечивая специальную обработку строк. Такие обработанные данные называются «приготовленными».

Стандартный узел ReadStreams по определению является уже «сырым», поскольку нет специальной обработки данных.

Итак, реорганизуйте свой код без вызова setRawMode(), и он должен работать нормально.

0

Это, как я обрабатывать данные из STDIN в узле:

function readStream(stream, callback) { 
    var data = ''; 
    stream.setEncoding('utf-8'); 
    stream.on('data', onData); 
    stream.on('end', onEnd); 

    function onData(chunk) { 
    data += chunk; 
    } 

    function onEnd() { 
    stream.removeListener('end', onEnd); 
    stream.removeListener('data', onData); 
    callback(data); 
    } 
} 

Сообщение об ошибке в ваших вопросы («не определено не является функцией») ошибка означает, что вы пытаетесь вызвать метод stdin, что не существует. Я не мог найти упоминание о setRawMode в беглом просмотре документов. Возможно, вы используете устаревший API? Я помню, что необходимость приостанавливать STDIN (потоки старого стиля) устарела.

Смежные вопросы