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 |