본문 바로가기

언어/JavaScript

Node.js로 입력값 받기

반응형

Readline

 

readline 모듈은 process.stdin 등의 읽을 수 있는 스트림으로부터 데이터를 읽는데 필요한 인터페이스를 제공한다.

다음을 사용함으로써 접근할 수 있다.

const readline = require('readline');

다음은 기본적인 사용 예시이다.

const readline = require('readline');

const rl = redline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('What do you think of Node.js? ', (answer) => {
  // TODO: Log the answer in a database
  console.log(`Thank you for your valueable feedback: ${answer}`);
  
  rl.close();
});

한 번 이 코드가 실행되면, Node.js 어플리케이션은 readline.Interface가 닫힐 때까지 종료되지 않는다. 왜냐하면 그 인터페이스는 인풋스트림에서 데이터가 받아지길 기다리기 때문이다.

 

Class: Interface

readline.Interface 클래스의 인스턴스는 readline.createInterface() 메서드를 사용하며 생성된다. 모든 인스턴스는 하나의 읽을 수 있는 input 스트림 그리고 하나의 쓸수 있는 output 스트림과 관련되어있다. output 스트림은 input 스트림으로 도착하는 유저 인풋, input 스트림으로부터 읽어지는 유저 인풋을 위한 프롬프트를 출력하는데 사용된다.

 

Event: 'close'

 

'close' 이벤트는 다음 중 하나의 상황이 일어날 때 발생한다.

  • rl.close() 메서드가 호출되고 readline.Interface 인스턴스가 input, output 스트림의 컨트롤을 놓았을 때
  • input스트림이 그것의 'end'이벤트를 받을 때
  • input스트림이 end-oftransmission(EOT) 신호로써 Ctrl+D 를 받을 때
  • input스트림이 SIGINT신호로써 Ctrl+C를 받으며, readLine.Interface 인스턴스에 등록된 'SIGINT'이벤트리스너가 없을 때

리스너 함수는 통과하는 아규먼트가 없을때 호출된다.

readline.Interface 인스턴스는 'closed' 이벤트가 한 번 발생하면 종료된다.

 

Event: 'line'

the 'line' event는 input 스트림이 end-of-line input(\n, \r, 또는 \r\n)을 받을 때 발생한다.

이것은 보통 유저가 Enter나 Return을 누를 때 발생한다.

이 리스너 함수는 받은 인풋 한 줄을 포함하는 스트링과 함께 호출된다.

 

rl.on('line', (input) => {
  console.log(`Received: ${input}`);
});

 

EXAMPLE: TINY CLI

다음의 예시는 작은 cli를 구현하는 데 readline.Interface 클래스를 사용하는 예시이다. 

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'OHAI> '
});

rl.prompt();

rl.on('line', (line) => {
  switch (line.trim()) {
	  case 'hello':
      	console.log('world!');
      	break;
      default:
      	console.log(`Say what? I might have heard '${line.trim()}'`);
        break;
  }
  rl.prompt();
}).on('close', () => {
  console.log('Have a great day!');
  process.exit(0);
});

 

Example: 파일 스트림을 한줄 한줄 읽기

보통 readline이 사용되는 케이스는 인풋 파일을 한 번에 한 줄씩 소비할 때이다. 그렇게 하는 가장 쉬운 방법은 for await...of 반복문 뿐만 아니라 fs.ReadStream API를 레버리징하는 것이다. 

const fs = require('fs');
const readline = require('readLine');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');
  
  const rl = readline.createInterface({
    input: fileStrea,
    crlfDelay: Infinity
  });
  // Note: 모든 CR LF의 인스턴스를 인식하기 위해 crlfDelay 옵션을 사용한다.
  // single line break로서 input.txt 안의 ('\r\n') 
  
  for await (const line of rl) {
  // input.txt의 각 줄은 'line'으로서 사용할 수 있다.
  console.log(`Line from file: ${line}`);
  }
}

processLineByLine();

 

반응형

'언어 > JavaScript' 카테고리의 다른 글

DOM  (0) 2021.05.14
Document  (0) 2021.05.13
Array.from()  (0) 2021.04.19
맵과 셋  (0) 2021.04.17
Map  (0) 2021.04.14