2014-10-20 2 views
4

저는 process.stdin을 이해하려고합니다."process.stdin.on"으로 작업하는 방법은 무엇입니까?

예 : 콘솔에 배열 요소를 표시해야합니다. 그리고 나는 어떤 요소가 표시 될지 사용자가 선택할 수있게해야한다.

내가 가진 코드 :

var arr = ['elem1','elem2','elem3','elem4','elem5'], 
    lastIndx = arr.length-1; 

showArrElem(); 

function showArrElem() { 

    console.log('press number from 0 to ' + lastIndx +', or "q" to quit'); 

    process.stdin.on('readable', function (key) { 
     var key = process.stdin.read(); 
     if (!process.stdin.isRaw) { 
      process.stdin.setRawMode(true); 
     } else { 
      var i = String(key); 
      if (i == 'q') { 
      process.exit(0); 
      } else { 
      console.log('you press ' +i); // null 
      console.log('e: ' +arr[i]); 
      showArrElem(); 
      }; 
     }; 
    }); 

}; 

왜 내가 수는 두 번째를 입력 할 때 "나는"널? "process.stdin.on"을 올바르게 사용하는 방법?

+0

http://nodejs.org/api/readline.html을 사용해 보셨습니까? – micnic

+0

아니요, 고마워요. 나는 할 것이다. – ivanesi

답변

5

모든 입력 문자 뒤에 process.stdinreadable 수신기를 연결하면 각 문자에 대해 process.stdin.read()이 두 번 이상 호출됩니다. stream.Readable.read(), process.stdin은의 인스턴스이고, 입력 버퍼에 데이터가 없으면 null을 반환합니다. 이 문제를 해결하려면 리스너를 한 번 연결하십시오.

process.stdin.setRawMode(true); 
process.stdin.on('readable', function() { 
    var key = String(process.stdin.read()); 
    showArrEl(key); 
}); 

function showArrEl (key) { 
    console.log(arr[key]); 
} 

또는 process.stdin.once('readable', ...)을 사용하여 1 회성 청취자를 첨부 할 수 있습니다.

+0

감사합니다. 그러나 몇 가지 질문이 더 있습니다 - 왜 내가 실행하고 아무것도 누르지 않으면 undefined가 나타 납니까? 그리고 rawMode를 false로 설정하면 작동하지 않습니다. 이유가 무엇입니까? – ivanesi

+0

스트림에서 데이터를 읽을 수있을 때'readable' 이벤트가 발생합니다. 따라서'read()'를 호출 할 때'null '을 체크해야 할 것이다. 기본적으로'stdin'은 cooked 모드에 있습니다. 이것은 캐리지 리턴 후에 문자들이 버퍼링되어 프로그램으로 보내진다는 것을 의미합니다. 프로그램을 원시 모드가 아닌 (요리 된) 상태로 작동 시키려면, 버퍼를 비우기 위해 글자를 타이핑 한 후 EOF (Ctrl + D)를 보내거나 Enter 키를 눌러 입력에서 새 줄을 제거하십시오. –

+0

이 경우 C? – SuperUberDuper

1

이것은 일반적으로 stdin (node.js)을 사용할 때 입력 방법입니다. 이것은 ES5 버전이며 아직 ES6을 사용하지 않습니다.

function processThis(input) { 
    console.log(input); //your code goes here 
} 

process.stdin.resume(); 
process.stdin.setEncoding("ascii"); 
_input = ""; 
process.stdin.on("data", function (input) { 
    _input += input; 
}); 

process.stdin.on("end", function() { 
    processThis(_input); 
}); 

희망이 도움이됩니다.

+0

process.stdin.on ("end",) 함수를 프로그래밍 방식으로 또는 대화식으로 호출하는 방법. 노드 js v.6.X를 사용하여 끝낼 수 없습니다. –

관련 문제